Используйте отражение, чтобы получить значение свойства по имени в экземпляре класса - PullRequest
9 голосов
/ 21 июня 2011

Допустим, у меня есть

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

, и я хотел бы создать метод, который принимает строку, содержащую "age" или "name", и возвращает объект со значением этого свойства.

Как и в следующем псевдокоде:

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

Как я могу сделать это с помощью отражения?

Я пишу с использованием asp.net 3.5, c # 3.5

Ответы [ 4 ]

14 голосов
/ 21 июня 2011

Я думаю, что это правильный синтаксис ...

var myPropInfo = myType.GetProperty("MyProperty");
var myValue = myPropInfo.GetValue(myInstance, null);
4 голосов
/ 21 июня 2011

Прежде всего, приведенный вами пример не имеет свойств.У него есть закрытые переменные-члены.Для свойств у вас будет что-то вроде:

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;
    }
}

И затем с помощью отражения получите значения:

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

Имейте в виду, хотя, поскольку у вас уже есть доступ к классу и его свойствам (поскольку у вас также есть доступ к методу), гораздо проще просто использовать свойства, а не делать что-то причудливое с помощью Reflection.

2 голосов
/ 21 июня 2011

Вы можете сделать что-то вроде этого:

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 );

Имейте в виду, поскольку это частные поля экземпляров, вам необходимо явно указать флаги привязки, чтобы получить их через отражение.

Edit:

Кажется, вы изменили свой пример с использования полей на свойства, поэтому я просто оставлю это здесь на случай, если вы вернетесь обратно. :)

0 голосов
/ 21 июня 2011

ClassInstance.GetType.GetProperties () получит ваш список объектов PropertyInfo.Прокрутите PropertyInfos, проверяя PropertyInfo.Name против propName.Если они равны, вызовите метод GetValue класса PropertyInfo, чтобы получить его значение.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...