2009-09-28 1 views
0

У меня проблема с получением значений класса, одним из которых является другой класс.Reflection C# question

Вот пример:

public class Person 
{ 
    private int age; 
    private string name; 

    public Person() 
    { 
     Address = new Address(); 

    } 

    public int Age 
    { 
     get { return age; } 
     set { age = value; } 
    } 

    public string Name 
    { 
     get { return name; } 
     set { name = value; } 
    } 

    public Address Address { get; set; } 
} 

public class Address 
{ 
    public string street { get; set; } 
    public string houseno { get; set; } 
} 


public class Program 
{ 
    static void Main(string[] args) 
    { 

     Person person = new Person(); 
     person.Age = 27; 
     person.Name = "Fernando Vezzali"; 
     person.Address.houseno = "123"; 
     person.Address.street = "albert street"; 

     Type type = typeof(Person); 

     PropertyInfo[] properties = type.GetProperties(); 
     foreach (PropertyInfo property in properties) 
     { 
      Console.WriteLine("{0} = {1}", property.Name, property.GetValue(person, null)); 

     } 
    } 
} 

Но с этим я не получаю значения адреса.

Может кто-то помочь здесь?

ответ

2

type.GetProperties() только получает свойства для , что тип, одним из которых является объект Address. street и houseno не являются собственностью на Person.

Console.Write... неявно вызывает ToString() по каждому параметру. Поэтому вы, вероятно, видите «Адрес - пространство имен.Address» в качестве вывода, потому что someAddressObject.ToString() вернет имя типа.

Самый простой способ получить то, что вы хотите для этой конкретной ситуации, чтобы переопределить ToString() на вашем Address объекта для вывода какой-то содержательный строковое представление объекта:

public override ToString() 
{ 
    return string.Format("#{0} {1}", 
     this.houseno, 
     this.street); //returns #123 StreetName 
} 

Если вы на самом деле нужно писать все имущество каждый под-объект на вашем объекте, который может быть довольно сложным, - вы, по сути, говорите о сериализации, которая рекурсирует дерево объектов и в каждый объект.

0

Либо вам нужно реализовать ToString() в адресе, если вы довольны возвратом отформатированной строки в качестве значения адреса, или ваш код итерации должен проверять каждое свойство, чтобы определить, также ли этот тип свойств предоставляет свойства, и поставить его в очередь для дальнейшей проверки.

2

Здесь можно ToString, принимая во внимание ответ на Джейсона ...

Вы также можете отдать свой возвращенное отражение Objet в адрес доступ к полному объекта и свойства

public class Address 
{ 
    public string street { get; set; } 
    public string houseno { get; set; } 
    public override ToString() { 
     return string.Format("street: {0}, house: {1}", street, houseno); 
    } 
} 
0

Ваш Еогеасп выполняет итерацию через все свойства должным образом, и я верю, что он неявно вызывает ToString на нем для получения значения, поэтому переопределяет метод ToString вашего класса Address и возвращает свойства как строку.

Или в тесте foreach проверьте, является ли ваше свойство типом значения или типом класса, получив тип свойства и проверив IsValueType или IsClass. Если IsValueType является ложным, то итерации по свойствам этого класса свойств класса так же, как и для свойств Person.

Что-то вроде этого (Вы, возможно, потребуется Твик, чтобы получить эту компиляцию, но это дает вам идею):

Person person = new Person();   
person.Age = 27;   
person.Name = "Fernando Vezzali";   
person.Address.houseno = "123";   
person.Address.street = "albert street";   

Type type = person.GetType();   

PropertyInfo[] properties = type.GetProperties();   
foreach (PropertyInfo property in properties)   
{ 
    //get the type of this property 
    Type tyProperty = property.PropertyType; 

    object oValue = property.GetValue(person, null));   

    //if the property is a value 
    if (tyProperty.IsValueType) 
    { 
     Console.WriteLine("{0} = {1}", property.Name, oValue); 
    } 
    else //else if property type is a class 
    { 
     oSubValue = property.GetValue(oValue, null)); 

     //loop through the classes properties 
     PropertyInfo[] lstSubProperties = tyProperty.GetProperties();   
     foreach (PropertyInfo propSub in lstSubProperties)   
     { 
      Console.WriteLine("{0} = {1}", propSub .Name, oSubValue); 
     } 
    } 
} 
+0

Привет Джереми, То, что я хочу сделать, но как это сделать, thats мой вопрос Я могу проверить, является ли его класс, но не удалось достичь, чтобы получить каждое свойство этого свойства (адрес). – Parminder