如何在C#中了解属性位置的层次结构?

3
例如,我有以下几个类。
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?
在反射中有没有方法可以知道属性位置的层次结构?
更新:
如果您查看Level1到Level3类,您可以看到fltprop位于Level1 => level2 => level3 => fltprop内。
现在通过使用反射,如果我将fltprop作为PropertyInfo获取,那么我能知道该属性来自Level1 => level2 => level3吗?这意味着通过获取propertyinfo,我必须知道此属性的根级别是level3,然后知道level3的根级别是level2,然后知道level2的根是level1。

2
一般来说,不行。你只有一个对象;这个对象可以在许多不同的地方使用,或者可以从同一图中的多个路线访问。唯一的方法是从表达式树开始表达这样的东西,即 Expression<Func<Level1,float>> expr = x => x.Level2.Level3.fltprop; - 如果你有了 那个,那么答案就是“是的”。 - Marc Gravell
1个回答

2
在反射中有没有办法知道属性位置的层次结构?不,没有。当你读取属性(实际上现在是一个字段)时,你只有一个值。没有关于你从哪个对象读取它的类型信息可用。当你拥有对象本身(Level3对象)时,编译器或运行时无法告诉你从哪里获取该对象。也许你只是创建了一个新的Level3实例,或者你从另一个对象的属性中读取了它。你只知道这一点,而不是运行时。假设你将fltprop的PropertyInfo与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'

如果你是正确的,举个例子,通过反射我正在遍历level1属性并找到fltprop属性,然后使用propertyinfo.setvalue(...)设置值。然后我们可以看到在从level1读取时反映出这个值。那么为什么我们不能知道它来自哪里? - Vetrivel mp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接