2011-02-17 51 views
1

是否可以在lambda表達式中引用私有屬性?還是隻有公共財產?參考Lambda表達式中的私有屬性?

例如。說我的私有財產被命名爲InnerCollection,代碼行是:

x => x.InnerCollection 

有沒有辦法以某種方式實現這一點 - 不使用反射等?

使用.NET 4.0。

謝謝。

克里斯

+0

「私有財產」意味着你不能從外部類訪問它。 – 2011-02-17 21:15:39

回答

0

除非lambda定義在該類的方法中定義了私有字段/屬性,否則不存在。那麼你必須處理反射。

+0

「除非你在課堂內部」聽起來像是指的是lambda調用,而不是lambda定義。注意Henk的答案在下面。 – shannon 2013-04-02 12:05:00

6

否,除非(不可能)拉姆達是類x的方法中定義。

0

你可以在課堂外或課堂內部使用,這隻適用於現在的領域,但如果你願意,你可以修改它的屬性。

public static Func<T, R> GetFieldAccessor<T, R>(string fieldName) 
{ 
    ParameterExpression param = 
    Expression.Parameter(typeof(T), "arg"); 

    MemberExpression member = 
    Expression.Field(param, fieldName); 

    LambdaExpression lambda = 
    Expression.Lambda(typeof(Func<T, R>), member, param); 

    Func<T, R> compiled = (Func<T, R>)lambda.Compile(); 
    return compiled; 
} 

使用將看起來是這樣的:

public class MyClass 
{ 
    private int _secret = 10; 
} 

var myClass = new MyClass(); 
Console.WriteLine("func:" + GetFieldAccessor<MyClass, int>("_secret").Invoke(myClass));