【问题标题】:How to know hierarchy of property location in c#?如何知道 c# 中属性位置的层次结构?
【发布时间】:2013-03-13 09:18:00
【问题描述】:

例如,我有以下课程。

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然后我知道这个属性的根级别3然后知道级别3的根级别2然后知道级别2的根是级别1。

【问题讨论】:

  • 一般情况下:没有。你所拥有的只是一个对象;该对象可以在许多不同的地方使用,或者可以从同一图中的多条路线访问。表达类似内容的唯一方法是从表达式树开始,即Expression<Func<Level1,float>> expr = x => x.Level2.Level3.fltprop; - 如果您有那个,那么答案将变为“是”。

标签: c# reflection


【解决方案1】:

有什么方法可以通过反射来知道属性位置的层次结构吗?

没有。没有。

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

编辑:

假设您将fltpropPropertyInfoLevel3 类型的对象一起传递给方法。该方法的所有信息是属性名称是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 读取时反映了这个值。那么为什么我们不知道它是从哪里来的呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多