在Lambda表达式中引用私有属性?

时间:2011-02-17 21:13:24

标签: c# lambda

是否可以在lambda表达式中引用私有属性?或者只是公共财产?

例如。说我的私有财产名为InnerCollection,代码行为:

x => x.InnerCollection

有没有办法以某种方式实现这一点 - 不使用反射等。?

使用.NET 4.0。

感谢。

克里斯

3 个答案:

答案 0 :(得分:6)

不,除非(不太可能)lambda是在x类的方法中定义的。

答案 1 :(得分:0)

除非lambda定义在类的方法中定义私有字段/属性,否则不存在。那么你将不得不处理反思。

答案 2 :(得分: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));