2010-02-01 53 views
3

我試圖傳遞一個Linq實體的屬性以供我的方法使用。我可以很容易地通過一個屬性來查詢在一個方法中傳遞一個Linq實體的屬性來設置和獲得結果

Func<Entities.MyEntity, ResultType> GetProperty = ent => ent.Property; 

但是,這將返回ResultType並且不能用於設置屬性。

我想過使用反射來獲取propertyInfo,但這會讓我獲取屬性,但是我不能使用Linq語法來調用我的屬性。有沒有哪位古魯知道如何做到這一點?

我有一種預感,我可以通過構建表達式樹的一大塊,並應用它到查詢做...

我真的很希望做一些事情,如:

var value = myQueryEntity.CallMagicFunction(); //typesafe 
myQueryEntity.CallMagicFunction() = value; //typesafe 

回答

3

事實上,表達樹應該工作;爲基本成員訪問(字段/屬性直接關閉對象):

static MemberInfo ReadMember(LambdaExpression expr) 
{ 
    if(expr == null) throw new ArgumentNullException("expr"); 
    MemberExpression me = expr.Body as MemberExpression; 
    if(me == null || !ReferenceEquals(me.Expression, expr.Parameters[0])) { 
     throw new ArgumentException("expr"); 
    } 
    return me.Member; 
} 

Expression<Func<Customer, int>> func = c => c.Id; 
MemberInfo member = ReadMember(func); 
// for simplicity assume prop: 
PropertyInfo prop = (PropertyInfo)member; 

從那裏,你可以做很多事情;特別是您可以獲得get/set訪問器(如果您想創建委託)或使用GetValue/SetValue

注意,在.NET 4.0中,你可以在一個Expression直接設置屬性(但C#編譯器添加任何額外的支持了這一點,所以你需要編寫自己的Expression手)。

+0

所以這使用表達式樹和反射來訪問propertyinfo對象。我意識到我可以打電話給會員並從這裏設置會員。我會認爲,如果不採取getvalue/setvalue的話,會有一種類型安全的方式。或者我應該開始在python編程... – Spence 2010-02-01 07:21:01

+0

@Spence - 當然;只需使用'obj.Id = ...';- p OK,更嚴重的是,您可以使用'Delegate'創建一個類型化委託 - 例如'Func '/'Action ' .CreateDelegate' - 你需要什麼?在4.0'動態'也可能是有趣的。 – 2010-02-01 13:40:57

相關問題