使用 lambda 获取扩展方法的第一个参数的属性? (x => x.请)

发布于 2025-01-02 11:46:00 字数 686 浏览 1 评论 0原文

我正在尝试这样做:

var order = new BuildingOrder(); //has a Sale property
var sale = order.ConfusinglyGet(() => order.Sale); //get value of order.Sale

到目前为止我能弄清楚的是:

public static O ConfusinglyGet<O>(this object i, Expression<Func<O>> expression)
{
    return expression.Compile()();
}

这会返回属性值吗?

我最终希望能够检查 i 是否为 null 并可选择返回 new O() ,例如

public static O FreemasonsOnly<I,O>(this I i, Expression<Func<O>> expression)
    where I : class,
    where O : class, new()
{
    return i != null ? expression.Compile()() : new O();
}

I'm trying to do this:

var order = new BuildingOrder(); //has a Sale property
var sale = order.ConfusinglyGet(() => order.Sale); //get value of order.Sale

So far all I can figure out is this:

public static O ConfusinglyGet<O>(this object i, Expression<Func<O>> expression)
{
    return expression.Compile()();
}

Will this return the property value?

I ultimately want to be able to check if i is null and optionally return new O() like

public static O FreemasonsOnly<I,O>(this I i, Expression<Func<O>> expression)
    where I : class,
    where O : class, new()
{
    return i != null ? expression.Compile()() : new O();
}

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

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

发布评论

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

评论(2

月下客 2025-01-09 11:46:00

您不需要使用 Expression 进行额外的间接级别,因为您没有在示例中传递表达式:您正在传递一个简单的 Func

这应该为您工作:

public static O FreemasonsOnly<I,O>(this I i, Func<I,O> f)
where I : class where O : class, new()
{
    return i != null ? f(i) : new O();
}

You do not need an extra level of indirection with Expression, because you are not passing an expression in your example: you are passing a simple Func<I,O>

This should work for you:

public static O FreemasonsOnly<I,O>(this I i, Func<I,O> f)
where I : class where O : class, new()
{
    return i != null ? f(i) : new O();
}
绝影如岚 2025-01-09 11:46:00

你想要的看起来是:

public static O ConfusinglyGet<T, O>(this T i, Expression<Func<T, O>> expression) where O : class, new()
{
    return expression.Compile()(i) ?? new O();
}

What it looks like you want is:

public static O ConfusinglyGet<T, O>(this T i, Expression<Func<T, O>> expression) where O : class, new()
{
    return expression.Compile()(i) ?? new O();
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文