2013-05-27 1 views
3

По некоторым причинам мне нужно создать словарь из PropertyInfo экземпляров, соответствующих некоторым свойствам класса (назовем его EntityClass).Получить информацию о недвижимости от объекта без указания имени свойства как строки

Хорошо, я мог бы использовать typeof(EntityClass).GetProperties().

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

EntityInstance.PropertyX = Value; 
typeof(EntityClass).GetProperty("PropertyX").SetValue(EntityInstance, Value, null); 

Для того, чтобы пополнить свой словарь, мне нужно использовать PropertyInfo экземпляры вместо того, чтобы просто установка значений нормально. Но я не чувствую себя комфортно, получая свойства по их строковым именам. Если какой-то EntityClass изменяется, это приведет к множеству исключений вместо ошибок компиляции. Итак, я прошу:

Как получить PropertyInfo известного свойства без передачи имени строки? Я хотел бы, если есть что-то, как и делегатов:

SomeDelegateType MyDelegate = EntityInstance.MethodX; 

В идеале:

SomePropertyDelegate MyPropertyDelegate = EntityInstance.PropertyX; 
+0

не могли бы вы описать сценарий? Я имею в виду код до и после модификации Entity. Кроме того, как вы можете ожидать, что переданное значение будет иметь один и тот же тип свойства после модификации? –

+0

Возможный дубликат [Как получить PropertyInfo определенного свойства?] (Http://stackoverflow.com/questions/491429/how-to-get-the-propertyinfo-of-a-specific-property) – nawfal

ответ

9

Что-то вроде этого?

string s = GetPropertyName<User>(x=> x.Name); 

public string GetPropertyName<T>(Expression<Func<T, object>> lambda) 
{ 
    var member = lambda.Body as MemberExpression; 
    var prop = member.Member as PropertyInfo; 
    return prop.Name; 
} 

или

public PropertyInfo GetPropertyInfo<T>(Expression<Func<T, object>> lambda) 
{ 
    var member = lambda.Body as MemberExpression; 
    return member.Member as PropertyInfo; 
} 

public class User 
{ 
    public string Name { set; get; } 
} 
+0

Теперь что Я просто выгляжу как твоя копия. Аналогичная логика даже в том же классе пользователя :) –

+2

'{" Невозможно наложить объект типа 'System.Linq.Expressions.UnaryExpression' на тип 'System.Linq.Expressions.MemberExpression'. "}' Любые подсказки? –

+0

@ Daniel Мне нужно больше информации. класс? как вы получаете доступ к члену? – I4V

4

Не уверен, что вам нужно, но может быть это поможет вам двигаться дальше.

public class Property<TObj, TProp> 
{ 
    private readonly TObj _instance; 
    private readonly PropertyInfo _propInf; 

    public Property(TObj o, Expression<Func<TObj, TProp>> expression) 
    { 
     _propInf = ((PropertyInfo)((MemberExpression)expression.Body).Member); 
     _instance = o; 
    } 

    public TProp Value 
    { 
     get 
     { 
      return (TProp)_propInf.GetValue(_instance); 
     } 
     set 
     { 
      _propInf.SetValue(_instance, value); 
     } 
    } 
} 

public class User 
{ 
    public string Name { get; set; } 
} 

var user = new User(); 
var name = new Property<User, string>(user, u => u.Name); 
name.Value = "Mehmet"; 
Console.WriteLine(name.Value == user.Name); // Prints True