2013-03-13 2 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?

Есть ли какой-либо способ отражения знать иерархию местоположения собственности?

Update:

Если посмотреть в класс Level1 к Level3, вы можете увидеть, что fltprop пребывает внутри Level1 => level2 => level3 => fltprop.

теперь с помощью отражения, если я получаю fltprop как PropertyInfo, тогда я могу знать, что это свойство от Level1 => level2 => level3? означает, что если взять свойствоinfo, то я знаю, что это корневой уровень этого свойства3, тогда зная уровень корня level2 root2, а затем знание level2's root - level1.

+2

Как правило: нет. Все, что у вас есть, - это объект; этот объект может использоваться во многих разных местах или может быть доступен из нескольких маршрутов на одном и том же графике. Единственный способ, которым вы можете выразить что-то вроде этого, - это начать с дерева выражений, то есть 'Expression > expr = x => x.Level2.Level3.fltprop;' - если у вас есть *, что * , тогда ответ становится «да». –

ответ

2

Есть ли какой-либо способ отражения знать иерархию местоположения собственности?

Нет. Нет.

Когда вы читаете свойство (на самом деле это поле прямо сейчас), у вас просто есть значение. Информация о типе объекта, который вы читали, недоступна. Когда у вас есть сам объект (Level3), компилятор или среда выполнения не могут сообщить вам, откуда вы взяли этот объект. Возможно, вы только что создали новый экземпляр Level3 или, возможно, прочитали его из свойства другого объекта. Вы просто знаете это, а не время исполнения.

EDIT:

Предположим, вы передаете PropertyInfo для fltprop, наряду с объектом типа 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 (...). то мы видим, что это значение отражается при чтении с уровня 1. так почему мы не можем знать, откуда оно? –