2013-03-13 64 views
3

例如,我有以下课程。如何知道c#中的财产位置的层次结构?

public class Level1 
{ 
    public int intprop; 
    public Level2 level2; 
} 

public class Level2 
{ 
    public string strprop; 
    public Level3 level3; 
} 

public class Level3 
{ 
    public float fltprop; 
} 

现在,如果我得到fltprop,那么如何知道这个属性的层次结构是这样的Level1.level2.level3.fltpro

有没有反思方法来了解物业位置的层次?

更新:

如果你看进级1级到Level3的,你可以看到fltprop里面是1级=>(第二级)=> 3级=> fltprop居住。

现在通过使用反射,如果我得到fltprop作为PropertyInfo,那么我可以知道这个属性是从Level1 => level2 => level3?意味着采取propertyinfo然后我知道这个属性的根级别3,然后知道level3的根级别2然后知道level2的根级别是level1。

+2

一般情况:没有。你拥有的只是一个物体;该对象可以在许多不同的地方使用,或者可以从同一图形中的多条路线访问。如果你从表达式树开始,例如'Expression > expr = x => x.Level2.Level3.fltprop;' - 如果你有* that * ,那么答案变成“是”。 – 2013-03-13 09:27:17

回答

2

是否有任何反思方式来了解财产位置的层次?

不,没有。

当您阅读属性(实际上它现在是一个字段),您只是有一个值。没有关于您读取的对象类型的信息。当您拥有对象本身(Level3对象)时,编译器或运行时无法告诉您从哪里获取该对象。也许你刚刚创建了一个Level3的新实例,或者你可能从另一个对象的属性中读取它。你只知道这一点,而不是运行时。

编辑:

假设你传递PropertyInfofltprop,与Level3类型的对象的方法沿。该方法的所有信息是属性名称是fltprop,它是从Level3类型。这不告诉方法在哪里Level3对象你传递给方法来自。这也不会存储在Level3类型信息中。实际上,当您阅读Level3的类型信息时,无论您获得的类型如何,它都是相同的:

var type1 = level3Obj.GetType(); 
var type2 = level1Obj.level2.level3.GetType(); 
var type3 = typeof(Level3); 
var type4 = fltpropPropertyInfo.ReflectedType; 

Console.WriteLine(type1 == type2); // outputs 'true' 
Console.WriteLine(type2 == type3); // also outputs 'true' 
Console.WriteLine(type3 == type4); // also 'true' 
+0

如果你是对的,说例如通过使用反射我循环通过level1属性并找到属性fltprop。然后我通过propertyinfo.setvalue(...)设置值。那么我们可以看到这个值在从level1读取时反映出来。为什么我们不知道它从哪里来? – 2013-03-13 09:36:21