Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using PropertyInfo.GetValue()

Tags:

I have a class that creates a static array of all properties, using a static constructor. I also have a function -- GetNamesAndTypes() -- that lists the name & type of each property in that array.

Now I want to create another instance-level function -- GetNamesAndTypesAndValues() -- that displays the name & type of each property in the class, as well as that instance's value. How would I do that? Here's the code that I've written so far:

//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();         }     } } 

I tried using propertyInfo.GetValue(), but I couldn't get it to work.

like image 991
Mass Dot Net Avatar asked Aug 30 '09 22:08

Mass Dot Net


People also ask

What does GetValue return c#?

GetValue(Object) Returns the property value of a specified object.

What is PropertyInfo?

< Previous Next > The PropertyInfo class discovers the attributes of a property and provides access to property metadata. The PropertyInfo class is very similar to the FieldInfo class and also contains the ability to set the value of the property on an instance.

What is reflection C#?

Reflection provides objects (of type Type) that describe assemblies, modules, and types. You can use reflection to dynamically create an instance of a type, bind the type to an existing object, or get the type from an existing object and invoke its methods or access its fields and properties.

Is reflection slow C#?

Reflection is not THAT slow. Invoking a method by reflection is about 3 times slower than the normal way. That is no problem if you do this just once or in non-critical situations.


1 Answers

In your example propertyInfo.GetValue(this, null) should work. Consider altering GetNamesAndTypesAndValues() as follows:

public void GetNamesAndTypesAndValues() {   foreach (PropertyInfo propertyInfo in allClassProperties)   {     Console.WriteLine("{0} [type = {1}] [value = {2}]",       propertyInfo.Name,       propertyInfo.PropertyType,       propertyInfo.GetValue(this, null));   } } 
like image 159
Yannick Motton Avatar answered Oct 19 '22 10:10

Yannick Motton