這是可能做到這一點:屬性構造和λ
public static void SomeMethod<TFunc>(Expression<TFunc> expr)
{
//LambdaExpression happily excepts any Expession<TFunc>
LambdaExpression lamb = expr;
}
,並把它在其他地方傳遞一個lambda爲參數:
SomeMethod<Func<IQueryable<Person>,Person>>(p=>p.FirstOrDefault());
我反而想傳遞一個表達式參數屬性構造函數。 是否可以做到以下幾點?
class ExpandableQueryAttribute: Attribute {
private LambdaExpression someLambda;
//ctor
public ExpandableQueryMethodAttribute(LambdaExpression expression)
{
someLambda = expression
}
}
//usage:
static LambdaExpression exp =
(Expression<Func<IQueryable<Person>, Person>>)
(p => p.FirstOrDefault());
[ExpandableQueryAttribute(exp)] //error here
// "An attribute argument must be a constant expression, typeof expression
// or array creation expression of an attribute parameter type"
我的目標是到指定屬性的構造方法或lambda(即使我不得不宣佈一個完整的命名方法,並以某種方式傳遞方法的名稱,我不會有事來) 。
參數類型可以改變,但它是非常重要的屬性構造可以採取的參數,並以某種方式能夠將它分配給類型LambdaExpression的領域
我想要的聲明lambda /方法只是在對屬性構造函數的調用之上,或者是內聯的,這樣你就不必走很遠才能看到傳遞的內容。
所以這些替代品將被罰款,但沒有運氣讓他們工作:
public static ... FuncName(...){...}
[ExpandableQueryAttribute(FuncName)]
// ...
或
//lambdas aren't allowed inline for an attribute, as far as I know
[ExpandableQueryAttribute(q => q.FirstOrDefault())]
// ...
現有的解決辦法是一些ID傳遞給構造函數(滿足「參數必須是一個常量」的要求),構造函數使用該參數在字典中查找以前添加了表達式的參數。希望能夠改進/簡化這一點,但是我有一種感覺,由於對屬性構造函數的限制,它並沒有得到任何改善。
按照你的感覺......對屬性參數的限制相當明確。 –
在這個鏈接也提出了問題。答案是目前不可能。 http://social.msdn.microsoft.com/Forums/en/vcsharp2008prerelease/thread/0d18c410-07b0-41cc-9c7f-9494633ca101 – Jamey
@Jamey是的,這是我列出的最後一個選擇,我知道是一個限制。希望通過將表達式聲明爲一個變量來解決這個問題,但是這個「必須是不變的」要求讓我受益匪淺。這個解決方法雖然很有意思,但我會嘗試一種變化。 – AaronLS