• 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();

    结果显示:

  • 相关阅读:
    多个div并排显示的居中问题——来自腾讯的一道面试题
    c++ 类的对象与指针
    c++ 联合体
    用户输入一个数字,找到所有能够除尽它的数的总个数
    javascript
    今天的排版
    论学习php的方法
    我想对所有新程序员说的一些话
    注册表单
    安卓机器人
  • 原文地址:https://www.cnblogs.com/kevin860/p/12638733.html
Copyright © 2020-2023  润新知