2013-05-27 28 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

請問你能描述一個場景嗎?我的意思是,修改實體之前和之後的代碼。另外,你怎麼能期望被傳遞的值是修改後屬性的相同類型? –

+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