在 Lambda 表达式中引用私有财产?

发布于 2024-10-18 02:40:32 字数 216 浏览 0 评论 0原文

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

例如。假设我的私有财产名为 InnerCollection,则代码行将是:

x => x.InnerCollection

有没有办法以某种方式实现此目的 - 不使用反射等?

使用.NET 4.0。

谢谢。

克里斯

Is it possible to reference a private property in a lambda expression? Or only public properties?

For example. say my private property is named InnerCollection, the line of code would be:

x => x.InnerCollection

Is there a way to achieve this somehow - without using reflection etc.?

Using .NET 4.0.

Thanks.

Chris

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

筱武穆 2024-10-25 02:40:32

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

No, unless (unlikely) the lambda is defined inside a method of the class of x.

み零 2024-10-25 02:40:32

您可以在类的外部或内部使用它,这目前仅适用于字段,但如果需要,您可以修改它的属性。

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));

You can use this outside or inside of the class, This is only working for fields right now but you can modify it for properties if you want.

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;
}

usage would looks something like this:

public class MyClass
{
     private int _secret = 10;
}

var myClass = new MyClass();
Console.WriteLine("func:" + GetFieldAccessor<MyClass, int>("_secret").Invoke(myClass));
忆梦 2024-10-25 02:40:32

除非 lambda 定义位于定义私有字段/属性的类的方法中,否则不会。那么你就必须处理反思。

Unless the lambda definition is in a method of the class the private field/property is defined in, no there isn't. You'll have to deal with reflection then.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文