【问题标题】:Get properties of properties获取属性的属性
【发布时间】:2020-12-02 08:25:14
【问题描述】:

所以,我有兴趣通过反射获取类的所有属性......以及类类型属性的所有属性(递归)。

我设法通过反射获得了第一级属性,代码如下:

foreach (var property in Target.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance))
{
  var foobar = Factory.GetDealer(Target, property.Name);
}

在工厂里:

public static BaseDealer GetDealer(Object obj, string property) 
{
  var prop = obj.GetType().GetProperty(property);
  if (prop == null)
  {
    return null;
  }

  if (prop.PropertyType.IsPrimitive)
  {
    return GetPrimitivDealer(obj, property, Type.GetTypeCode(prop.PropertyType));
  }

  if (prop.PropertyType.IsClass)
  {
    return new CompositeDealer(obj, prop);
  }

  return null;
}

显然(在我看来是这样),然后我会在 CompositeDealer 中有这样的东西:

   public CompositeDealer(Object obj, PropertyInfo propInfo)
   {      
      ComponentDealers = new List<BaseDealer>();
      Object compProp = propInfo.GetValue(obj);  // The new "origin" object for reflection, this does not work
      foreach (var property in compProp.GetType().GetProperties())
      {
        var dealer = Factory.GetDealer(compProp, property.Name);
        if (dealer != null)
        {
          ComponentDealer.Add(dealer);
        }
      }
   }

正如评论中所说,获取新的“基础对象”进行反射,即启动“第二级”反射不起作用,它返回null。 在这个阶段我真的很挣扎,尽管我已经走了这么远而且已经很接近了(我认为)。

帮助我 StackOverflow, 你是我唯一的希望。

编辑: 因此,回答数据是什么样子的问题:

class A {
   int primitiveProp {get;}
}
class B {
   A compositeProp {get;}
}

如果我要在 A 的实例上调用工厂,我会创建一个 PrimitiveDealer。 如果我们在 B 的一个实例上调用它,我会得到一个 CompositeDealer,而后者又具有一个primitiveDealer。 另请注意,我需要传递实例的实际属性对象(因为我需要对其进行操作)而不是新对象。

【问题讨论】:

  • @CorentinPane:它只是在工厂中看到的构造函数中传递的 PropertyInfo(第二个代码 sn-p)。我更新了最后一个 sn-p
  • 也许你的对象的属性实际上是空的?您在哪种对象上尝试过您的方法?

标签: c# generics reflection


【解决方案1】:

不是调用不同的函数来获取对象的属性,而是依赖于属性类型,然后函数应该使用我们想要获取其属性的对象的实例来调用自身。

object o = Activator.CreateInstance(property.PropertyType)

递归调用获取该对象属性的函数。

编辑:如果您需要实际对象,请确保将其转换为正确的类型。

Type compProp = (Type)propInfo.GetValue(obj);  

【讨论】:

  • 谢谢,这可能是我正在寻找的......但是:这是否给了我实际的对象或者更确切地说是创建一个属性类型的新对象?我确实想要实际的对象(用于操作目的)。
  • 这将创建该类型的一个实例,以便您可以遍历该类型的每个属性。然后您可以传递此实例对象(递归获取此类型的属性)。在上面的示例中,您使用 GetValue 获取实际对象,但是您需要将其转换为正确的类型,以便您可以获得该类型的属性而不是 Object 类型的属性。
  • 谢谢。 GetValue 和演员阵容的技巧确实起到了作用,但如果我对实际对象不感兴趣,那么您的初始答案已经很有效了!
猜你喜欢
  • 2015-01-29
  • 2014-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多