【发布时间】: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