• 使用Path语法取得对象的值


    借鉴了http://stackoverflow.com/questions/4473928/c-sharp-dynamic-string-property-path

     

     

    public class ReflectUtil
       {
           public static object ReflectOnPath(object o, string path)
           {
               object value = o;
               string[] pathComponents = path.Split('.');
               foreach (var component in pathComponents)
               {
                   var x = component.Split(':');

                   value = value.GetType().GetProperty(x[0]).GetValue(value, null);

                   if (value.GetType().IsArray)
                   {
                       int[] index = null;
                       if (x.Length > 1)
                           index = x.Skip(1).Take(int.MaxValue).Select(y => int.Parse(y)).ToArray();
                       if (index != null) value = ((Array)value).GetValue(index);
                   }
               }
               return value;
           }
       }

     

     

     

    Example:

    [TestMethod]
           public void TestGetValue()
           {
               var o = new DistributeCfg
               {
                   Configs = new[]
                   {
                       new Config.Config
                       {
                           AppType = "v",
                           CallbackUrl = "fasdfasdf",
                           Key = "k",
                            NoticePostDataSetting = new PostDataSetting
                            {
                                 Args = new Arg[]
                                 {
                                      new Arg
                                      {
                                           Name = "name1",
                                           Value = "a.b.c"
                                      },
                                       new Arg
                                      {
                                           Name = "name2",
                                           Value = "a.b.c"
                                      }
                                 }
                            },
                             PredictPostDataSetting  = new PostDataSetting
                            {
                                 Args = new Arg[]
                                 {
                                      new Arg
                                      {
                                           Name = "name1",
                                           Value = "Predict.b.c"
                                      },
                                      new Arg
                                      {
                                           Name = "name2",
                                           Value = "Predict.b.c"
                                      }
                                 },
                                  DeleteFlgSetting = new DeleteFlgSetting
                                  {
                                       Audit = "1,2",
                                        Delete = "9",
                                         Pass = "10"
                                  }
                            },
                       },
                         new Config.Config
                       {
                           AppType = "v",
                           CallbackUrl = "asdfasdfasdf",
                           Key = "k",
                            NoticePostDataSetting = new PostDataSetting
                            {
                                 Args = new Arg[]
                                 {
                                      new Arg
                                      {
                                           Name = "name1",
                                           Value = "a.b.c"
                                      },
                                       new Arg
                                      {
                                           Name = "name2",
                                           Value = "a.b.c"
                                      }
                                 }
                            },
                             PredictPostDataSetting  = new PostDataSetting
                            {
                                 Args = new Arg[]
                                 {
                                      new Arg
                                      {
                                           Name = "name1",
                                           Value = "Predict.b.c"
                                      },
                                      new Arg
                                      {
                                           Name = "name2",
                                           Value = "Predict.b.c"
                                      }
                                 },
                                  DeleteFlgSetting = new DeleteFlgSetting
                                  {
                                       Audit = "1,2",
                                        Delete = "9",
                                         Pass = "10"
                                  }
                            },
                       }
                   }
               };


               //var d = o.GetType().GetField("Configs").GetValue(o);


               string path = "Configs:0.PredictPostDataSetting.Args:0.Name";
               Console.WriteLine(ReflectUtil.ReflectOnPath(o, path));
               var p = o.GetType().GetProperty("Configs");
               //p.GetValue()
               //var array = o.GetType().GetProperty("Configs").GetType().IsArray;


               //var value = o.GetType().GetProperty("Configs").GetValue(o);

     

           }


           [TestMethod]
           public void TestValue()
           {
               var a = new A();
               a.Field = new B();
               a.Field.SubField = 10;

               string path = "Field.SubField";
               Console.WriteLine(ReflectUtil.ReflectOnPath(a, path));
           }

  • 相关阅读:
    SwiftyUserDefaults-封装系统本地化的框架推荐
    转:AFNetworking 与 UIKit+AFNetworking 详解
    转:KVC/KVO原理详解及编程指南
    转:NSString什么时候用copy,什么时候用strong
    代码重构原则
    转:【iOS开发每日小笔记(十一)】iOS8更新留下的“坑” NSAttributedString设置下划线 NSUnderlineStyleAttributeName 属性必须为NSNumber
    转:iOS程序main函数之前发生了什么
    转:iOS 屏幕适配,autoResizing autoLayout和sizeClass图文详解
    Apple macOS Mojave Intel Graphics Driver组件任意代码执行漏洞
    巧用"记事本"让病毒无效运行
  • 原文地址:https://www.cnblogs.com/zbw911/p/4953947.html
Copyright © 2020-2023  润新知