2013-05-13 3 views
2

Я пришел на этом сайте (http://snipplr.com/view.php?codeview&id=17637), который иллюстрирует использование отражения, как это:C# и использование отражения

public class Person 
    { 
     public int Age { get; set; } 
     public string Name { get; set; } 
    } 

    private void button2_Click_1(object sender, EventArgs e) 
    { 
     var person = new Person { Age = 30, Name = "Tony Montana" }; 
     var properties = typeof(Person).GetProperties(); 
     foreach (PropertyInfo property in properties) 
     { 
      Console.WriteLine("{0} = {1}", property.Name, property.GetValue(person, null)); 
     } 
    } 

codesnippet выше даст вам: Возраст: 30 Имя: Tony Montana

Что делать, если мы добавили «Малыш» в классе «AnotherPerson» как этот

public class Kid 
    { 
     public int KidAge { get; set; } 
     public string KidName { get; set; } 
    } 
    public class AnotherPerson 
    { 
     public int Age { get; set; } 
     public string Name { get; set; } 
     public Kid Kid { get; set; } 
    } 

Этот фрагмент кода;

private void button3_Click(object sender, EventArgs e) 
    { 
     var anotherPerson = new AnotherPerson { Age = 30, Name = "Tony Montana", Kid = new Kid { KidAge = 10, KidName = "SomeName" } }; 
     var properties = typeof(AnotherPerson).GetProperties(); 
     foreach (PropertyInfo property in properties) 
     { 
      Console.WriteLine("{0} = {1}", property.Name, property.GetValue(anotherPerson, null)); 
     } 
    } 

дает мне: Возраст: 30 Имя: Tony Montana Kid: ProjectName.Form1 + Kid

Не совсем то, что я искал .... Могу ли я использовать отражение для итерацию корыта " Малыш "тоже? Предложения?

+2

Сделайте то же самое для объекта 'kid' – I4V

+1

Вы действительно заинтересованы в некоторой форме сериализации, например, JSON? http://json.codeplex.com/ –

+0

, вам нужно будет рекурсивно вызвать ваш метод вывода и посмотреть, является ли свойство объектом, я считаю, что этот вопрос делает все: http://stackoverflow.com/questions/6196413/ как-to-recursively-print-the-values-of-the-objects-properties-using-reflection – gordatron

ответ

0

Может иметь вспомогательный метод, который является чем-то вроде этого?

public List<KeyValuePair<string, object>> GetPropertiesRecursive(object instance) 
{ 
    List<KeyValuePair<string, object>> propValues = new List<KeyValuePair<string, object>>(); 
    foreach(PropertyInfo prop in instance.GetType().GetProperties()) 
    { 
    propValues.Add(new KeyValuePair<string, object>(prop.Name, prop.GetValue(instance, null)); 
    propValues.AddRange(GetPropertiesRecursive(prop.GetValue(instance)); 
    } 
} 

вызова, как - GetPropertiesRecursive(anotherPerson)

+0

Вам не нужен параметр 'Type' – I4V

+0

@ I4V вот-вот изменит это;) – LukeHennerley

0
var anotherPerson = new AnotherPerson { Age = 30, Name = "Tony Montana", Kid = new Kid { KidAge = 10, KidName = "SomeName" } }; 
    var properties = typeof(AnotherPerson).GetProperties(); 
    foreach (PropertyInfo property in properties) 
    { 

     if (property.PropertyType == typeof(Kid)){ 
      var pp = typeof(Kid).GetProperties(); 
      Console.WriteLine("Kid:"); 
      foreach (PropertyInfo p in pp) 
      { 
       Console.WriteLine("\t{0} = {1}", p.Name, p.GetValue(anotherPerson.Kid, null)); 
      } 
     } 
     else 
      Console.WriteLine("{0} = {1}", property.Name, property.GetValue(anotherPerson, null)); 
    } 
+0

Что произойдет, если OP добавила тип «Подросток» в «AnotherPerson»? Идея размышления в этом контексте, вероятно, должна сделать ее максимально возможной для будущего :) – LukeHennerley

+1

Это слишком сложно. – James

+0

Правда, для того, чтобы быть _flexible_, вы должны рассматривать примитивные типы, массивы, списки, словари и индексированные свойства. –

0

Код перебирает свойства и использует ToString (через String.Format метода, который использует Console.WriteLine), чтобы получить строковое представление значений свойств.

Если вы хотите, чтобы изменить то, как отображается значение Kid свойства, то есть в основном два варианта:

  1. Проверьте тип объекта (property.PropertyType) в коде отражения, так что вы можете сделать что-то разные для типа Kid.

  2. Переопределите метод ToString в классе Kid, чтобы он возвращал любую строку, которую вы хотите отобразить как значение.

0

метод делает некоторые рекурсии можно получить значения для свойств в свойствах:

public static string GetProperties(object obj) 
{ 
    var t = obj.GetType(); 
    var properties = t.GetProperties(); 
    var s = ""; 
    foreach (PropertyInfo property in properties) 
    { 
     object propValue = property.GetValue(obj, new object[0]); 
     string propertyToString; 
     if (t.GetMethod("ToString").DeclaringType != typeof(object)) 
      propertyToString = propValue.ToString(); 
     else if (typeof(IConvertible).IsAssignableFrom(property.PropertyType)) 
      propertyToString = Convert.ToString(propValue); 
     else 
      propertyToString = GetProperties(propValue); 

     s += string.Format("'{0}' = '{1}'", property.Name, propertyToString); 
    } 
    return s; 
} 

Если вы имели практические цели в виду, JSON (или другой) сериализации может быть более подходящим, например, используя JSON.net, вы получите аналогичную строку.

Смежные вопросы