TheMoot
TheMoot

Reputation: 3037

Use reflection to get the value of a property by name in a class instance

Lets say I have

class Person
{
    public Person(int age, string name)
    {
        Age = age;
        Name = name; 
    }
    public int Age{get;set}
    public string Name{get;set}
}

and I would like to create a method that accepts a string that contains either "age" or "name" and returns an object with the value of that property.

Like the following pseudo code:

    public object GetVal(string propName)
    {
        return <propName>.value;  
    }

How can I do this using reflection?

I am coding using asp.net 3.5, c# 3.5

Upvotes: 10

Views: 19872

Answers (4)

Todd
Todd

Reputation: 1481

I think this is the proper syntax...

var myPropInfo = myType.GetProperty("MyProperty");
var myValue = myPropInfo.GetValue(myInstance, null);

Upvotes: 16

Justin Niessner
Justin Niessner

Reputation: 245389

First of all, the example you provided has no Properties. It has private member variables. For properties, you would have something like:

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

    public Person(int age, string name)
    {
        Age = age;
        Name = name;
    }
}

And then using reflection to get the values:

 public object GetVal(string propName)
 {
     var type = this.GetType();
     var propInfo = type.GetProperty(propName, BindingFlags.Instance);
     if(propInfo == null)
         throw new ArgumentException(String.Format(
             "{0} is not a valid property of type: {1}",
             propName, 
             type.FullName));

     return propInfo.GetValue(this);
 }

Keep in mind, though, that since you would already have access to the class and its properties (because you also have access to the method), it's much easier just to use the properties rather than do something fancy via Reflection.

Upvotes: 4

Brandon Moretz
Brandon Moretz

Reputation: 7621

You can do something like this:

Person p = new Person( 10, "test" );

IEnumerable<FieldInfo> fields = typeof( Person ).GetFields( BindingFlags.NonPublic | BindingFlags.Instance );

string name = ( string ) fields.Single( f => f.Name.Equals( "name" ) ).GetValue( p );
int age = ( int ) fields.Single( f => f.Name.Equals( "age" ) ).GetValue( p );

Keep in mind since these are private instance fields you need to explicitly state the binding flags in order to get them via reflection.

Edit:

It seems you changed your sample from using fields to properties, so I'm just going to leave this here in case you change back again. :)

Upvotes: 2

NoAlias
NoAlias

Reputation: 9193

ClassInstance.GetType.GetProperties() will get you your list of PropertyInfo objects. Spin through the PropertyInfos checking PropertyInfo.Name against propName. If they're equal then call the GetValue method of the PropertyInfo class to get its value.

http://msdn.microsoft.com/en-us/library/system.reflection.propertyinfo.aspx

Upvotes: 0

Related Questions