zoukankan      html  css  js  c++  java
  • C# 反射获取属性值、名称、类型以及集合的属性值、类型名称

    实体类

    class Product
        {
            public string Id { get; set; }
            public string Name { get; set; }
            public List<ProductDetail> Detail { get; set; }
            public List<ProductComment> Comment { get; set; }
        }
        class ProductDetail
        {
            public string DtlId { get; set; }
            public string Id { get; set; }
            public decimal Number { get; set; }
            public decimal Price { get; set; }
            public decimal Amount { get; set; }
        }
        class ProductComment
        {
            public string DtlId { get; set; }
            public string Id { get; set; }
            public string Comment { get; set; }
        }

    反射获取属性值等,中间加了小数位数保留的操作(黄色部分)

    static void FromatDitits<T>(T model)
            {
                var newType = model.GetType();
                foreach (var item in newType.GetRuntimeProperties())
                {
                    var type = item.PropertyType.Name;
                    var IsGenericType = item.PropertyType.IsGenericType;
                    var list = item.PropertyType.GetInterface("IEnumerable", false);
                    Console.WriteLine($"属性名称:{item.Name},类型:{type},值:{item.GetValue(model)}");
                    if (IsGenericType && list != null)
                    {
                        var listVal = item.GetValue(model) as IEnumerable<object>;
                        if (listVal == null) continue;
                        foreach (var aa in listVal)
                        {
                            var dtype = aa.GetType();
                            foreach (var bb in dtype.GetProperties())
                            {
                                var dtlName = bb.Name.ToLower();
                                var dtlType = bb.PropertyType.Name;
                                var oldValue = bb.GetValue(aa);
                                if (dtlType == typeof(decimal).Name)
                                {
                                    int dit = 4;
                                    if (dtlName.Contains("price") || dtlName.Contains("amount"))
                                        dit = 2;
                                    bb.SetValue(aa, Math.Round(Convert.ToDecimal(oldValue), dit, MidpointRounding.AwayFromZero));
                                }
                                Console.WriteLine($"子级属性名称:{dtlName},类型:{dtlType},值:{oldValue}");
                            }
                        }
                    }
                }
            }

    测试方法:

    var model = new Product
                {
                    Id = "111",
                    Name = "Test1",
                    Detail = new List<ProductDetail>
                    {
                        new ProductDetail{Id="111" ,DtlId="1",Number=12.3568M,Price=5.689M,Amount=70.2978352M},
                        new ProductDetail{Id="111",DtlId="2",Number=12.35M,Price=5.689M,Amount=70.2978352M},
                        new ProductDetail{Id="111",DtlId="3",Number=12.358M,Price=5.689M,Amount=70.304662M},
                    }
                };
                FromatDitits<Product>(model);
                Console.WriteLine("----------------------------");
                foreach (var item in model.Detail)
                {
                    Console.WriteLine($"Number值为:{item.Number},Price值为:{item.Price},Amount值为:{item.Amount}");
                }
    
                Console.ReadKey();

    结果显示:

  • 相关阅读:
    video 标签在微信浏览器的问题解决方法
    微信朋友圈分享之自定义网页按钮分享
    巧用weui.topTips验证数据
    巧用weui.gallery(),点击图片后预览图片
    巧用ajax请求服务器加载数据列表时提示loading
    页面间固定参数,通过cookie传值
    手机端页面下拉加载数据的笨办法--点击按钮添加数据
    LeetCode 41 First Missing Positive(找到数组中第一个丢失的正数)
    LeetCode 40 Combination Sum II(数组中求和等于target的所有组合)
    LeetCode 39 Combination Sum(满足求和等于target的所有组合)
  • 原文地址:https://www.cnblogs.com/kevin860/p/12638733.html
Copyright © 2011-2022 走看看