如何通过从具有类型层次结构的字符串中知道其名称来获取属性值

本文关键字:属性 获取 何通过 类型 字符串 层次结构 | 更新日期: 2023-09-27 18:13:19

我有以下的类层次结构

  class firstlevel
  {
      public secondlevel sl { get; set; }
  }
  class secondlevel
  {
      public string Name { get; set; }
  }

创建了一个firstlevel对象,名称设置为sandy。var fl =新一级{sl =新二级{Name = "sandy"}};

这是一个例子,我不知道实际场景中的Name,但我知道这个类的层次结构。

我需要写一个方法来获取Name 的值

通过阅读很多东西,我写了下面的代码,但令人惊讶的是,它给了我的属性的名字,而不是它的值,我想知道我的代码是什么错了,有人能弄清楚吗。

  public static Object GetValue()
  {
      var fl = new firstlevel { sl = new secondlevel { Name = "sandy" } };
      Object obj = fl;
      const string path = "fl.sl.Name";
      String[] part = path.Split('.');
      Type type = obj.GetType();
      string firstPart = part[0];
      string secondpart = part[1];
      string thirdpart = part[2];
      PropertyInfo info = type.GetProperty(secondpart);
      if (info == null) { return null; }
      PropertyInfo info1 = info.GetType().GetProperty(thirdpart);
      if (info1 == null) { return null; }
      return info1.GetValue(info1, null);
  }

如何通过从具有类型层次结构的字符串中知道其名称来获取属性值

这可能行得通

public static Object GetValue()
  {
        var fl = new firstlevel { sl = new secondlevel { Name = "sandy" } };
        Object obj = fl;
        const string path = "fl.sl.Name";
        String[] part = path.Split('.');
        Type type = obj.GetType();
        string firstPart = part[0];
        string secondpart = part[1];
        string thirdpart = part[2];
        System.Reflection.PropertyInfo info = type.GetProperty(secondpart);
        if (info == null) { return null; }

        System.Reflection.PropertyInfo info1 = info.PropertyType.GetProperty(thirdpart);
        if (info1 == null) { return null; }

        return info1.GetValue(fl.sl, null);
}

我所犯的错误是没有获得内部对象的值(实例)以获得最后一个属性,相反,我直接尝试通过其类型访问它,这是错误的。

正确答案如下:

   public static Object GetValue()
   {
       var fl = new firstlevel { sl = new secondlevel { Name = "imran" } };
       Object obj = fl;
       const string path = "fl.sl.Name";
       var part = path.Split('.');
       var type = obj.GetType();
       var firstPart = part[0];
       var secondpart = part[1];
       var thirdpart = part[2];
       var info = type.GetProperty(secondpart);
       if (info == null) { return null; }
       var secondObject = info.GetValue(obj, null);
       return secondObject.GetType().GetProperty(thirdpart).GetValue(secondObject);
   }

这很好,下面是任何层次结构级别的泛型方法

  public static Object GetValueFromClassProperty(String typeHierarichy, Object parentClassObject)
  {
      foreach (String part in typeHierarichy.Split('.'))
      {
          if (parentClassObject == null) { return null; }
          Type type = parentClassObject.GetType();
          PropertyInfo info = type.GetProperty(part);
          if (info == null) { return null; }
          parentClassObject = info.GetValue(parentClassObject, null);
      }
      return parentClassObject;
  }

Call类似于

 string value = GetValueFromClassProperty(fl,"sl.Name");

我还发现了一个很棒的类Reflector,它可以完成所有这些以及更多的功能,并且是开源的