【发布时间】:2015-04-02 04:20:02
【问题描述】:
我可以指定一个方法将Expression<Func<Foo, object>> 作为参数,以获取如下所示的 api:
// With a method declaration like this...
public void Foo(Expression<Func<Bar, object>> selector) { .... }
// ...I can invoke the method like this
Foo(b => b.Baz);
Foo(b => new { b.Baz, b.Foo });
但是,我正在编写一个 API,该 API 将受益于能够仅允许选择单个属性。像这样:
public void Foo(Expression<Func<Bar, ...>> selector) { .... }
// This would be OK.
Foo(b => b.Baz);
// But this would not...
Foo(b => new { b.Baz, b.Foo });
有没有办法表达这种方式来限制这种表达方式?
当然,我总是可以只记录这一点并在运行时检查表达式,但如果可能的话,如果可以避免的话,我更愿意创建一个不会引发 RuntimeExceptions 的 API。
编辑:
我想我可以将方法声明中 Func 的返回值更改为特定类型,从而至少对表达式进行一些限制。但我不想这样做,因为我希望能够在此方法调用中接受几乎任何类型的属性。
【问题讨论】:
-
你应该编写你的代码,这样即使他们传递了一个表达式,它做的事情不仅仅是投射到一个属性。无论您拥有的任何代码仅在表达式只是属性访问时才有效,都应该重写以降低脆弱性。
标签: c# lambda expression