2009-08-30 14 views
20

Mam klasę, która tworzy statyczną tablicę wszystkich właściwości za pomocą konstruktora statycznego. Mam również funkcję - GetNamesAndTypes() - która wyświetla nazwę każdej z właściwości w tej tablicy.Korzystanie z PropertyInfo.GetValue()

Teraz chcę utworzyć inną funkcję na poziomie instancji - GetNamesAndTypesAndValues ​​() - która wyświetla nazwę każdej właściwości w klasie, a także wartość tej instancji. Jak to zrobić? Oto kod, który pisałem do tej pory:

//StaticTest.cs 
using System; 
using System.ComponentModel; 
using System.Globalization; 
using System.Reflection; 

namespace StaticTest 
{ 
    public class ClassTest 
    { 
     private string m_A, m_B, m_C; 
     private static PropertyInfo[] allClassProperties; 

     static ClassTest() 
     { 
      Type type = typeof(ClassTest); 
      allClassProperties = type.GetProperties(); 

      // Sort properties alphabetically by name 
      // (http://www.csharp-examples.net/reflection-property-names/) 
      Array.Sort(allClassProperties, delegate(PropertyInfo p1, PropertyInfo p2) 
      { 
       return p1.Name.CompareTo(p2.Name); 
      }); 
     } 

     public int A 
     { 
      get { return Convert.ToInt32(m_A); } 
      set { m_A = value.ToString(); } 
     } 

     public string B 
     { 
      get { return m_B; } 
      set { m_B = value; } 
     } 

     public DateTime C 
     { 
      get { return DateTime.ParseExact("yyyyMMdd", m_C, 
            CultureInfo.InvariantCulture); } 
      set { m_C = String.Format("{0:yyyyMMdd}", value); } 
     } 

     public static void GetNamesAndTypes() 
     { 
      foreach (PropertyInfo propertyInfo in allClassProperties) 
      { 
       Console.WriteLine("{0} [type = {1}]", propertyInfo.Name, 
              propertyInfo.PropertyType); 
      } 
     } 

     public void GetNamesAndTypesAndValues() 
     { 
      foreach (PropertyInfo propertyInfo in allClassProperties) 
      { 
       Console.WriteLine("{0} [type = {1}]", propertyInfo.Name, 
              propertyInfo.PropertyType); 
      } 
     } 
    } 
} 

//Program.cs 
using System; 
using System.Collections.Generic; 
using StaticTest; 

namespace ConsoleApplication2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine("[static] GetNamesAndTypes()"); 
      ClassTest.GetNamesAndTypes(); 
      Console.WriteLine(""); 

      ClassTest classTest = new ClassTest(); 
      classTest.A = 4; 
      classTest.B = @"bacon"; 
      classTest.C = DateTime.Now; 
      Console.WriteLine("[instance] GetNamesAndTypesAndValues()"); 
      classTest.GetNamesAndTypesAndValues(); 

      Console.ReadLine(); 
     } 
    } 
} 

Próbowałem za pomocą propertyInfo.GetValue(), ale nie mogę zmusić go do pracy.

Odpowiedz

33

W twoim przykładzie powinien działać propertyInfo.GetValue(this, null). Rozważ zmianę GetNamesAndTypesAndValues() następująco:

public void GetNamesAndTypesAndValues() 
{ 
    foreach (PropertyInfo propertyInfo in allClassProperties) 
    { 
    Console.WriteLine("{0} [type = {1}] [value = {2}]", 
     propertyInfo.Name, 
     propertyInfo.PropertyType, 
     propertyInfo.GetValue(this, null)); 
    } 
} 
+11

ile dobrze dla zwykłych prostych właściwości, to nie powiedzie się z właściwościami Indexer, które odbywają się listę argumentów niż null określonych przez PropertyInfo.GetIndexParameters. –