To jest możliwe, aby to zrobić:Atrybut konstruktor Lambda
public static void SomeMethod<TFunc>(Expression<TFunc> expr)
{
//LambdaExpression happily excepts any Expession<TFunc>
LambdaExpression lamb = expr;
}
i nazywają to gdzie indziej przechodzącą lambda dla parametru:
SomeMethod<Func<IQueryable<Person>,Person>>(p=>p.FirstOrDefault());
bym zamiast chciał przekazać wyrażenie jako parametr do konstruktora atrybutów. Czy jest możliwe aby wykonać poniżej?
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"
Moim celem jest określenie sposobu lub lambda w konstruktorze atrybutu (nawet jeśli będę musiał zadeklarować pełną metodę o nazwie i przekazać nazwę metody jakoś, że byłoby dobrze, aby) .
rodzaje parametrów mogą się zmienić, ale ważne jest, że konstruktor atrybut może mieć ten parametr i w jakiś sposób móc przypisać go do pola typu LambdaExpression
Chcę deklarację lambda/metoda się tuż nad wywołaniem konstruktora atrybutu lub inline, tak że nie trzeba iść daleko, by zobaczyć, co jest przekazywane.
Więc te alternatywy byłoby w porządku, ale bez powodzenia zachęcając do pracy:
public static ... FuncName(...){...}
[ExpandableQueryAttribute(FuncName)]
// ...
lub
//lambdas aren't allowed inline for an attribute, as far as I know
[ExpandableQueryAttribute(q => q.FirstOrDefault())]
// ...
Dotychczasowa praca wokół jest przekazać identyfikator numeryczny do konstruktora (spełniająca „argumentu musi być stała” wymóg), który jest używany przez konstruktora wykonać wyszukiwanie w słowniku gdzie wyrażenia zostały dodane wcześniej. Miałem nadzieję poprawić/uprościć to, ale mam wrażenie, że nie ma nic lepszego z powodu ograniczeń konstruktorów atrybutów.
Podążaj za swoim uczuciem ... ograniczenie argumentu atrybutu jest raczej jasne. –
Pytanie zostało również zadane pod tym linkiem. Odpowiedź była taka, że obecnie nie jest to możliwe. http://social.msdn.microsoft.com/Forums/en/vcsharp2008prerelease/thread/0d18c410-07b0-41cc-9c7f-9494633ca101 – Jamey
@Jamey Yep, jest to ostatnia alternatywa, którą wymieniłem, co do którego wiedziałem, że jest ograniczeniem. Miałem nadzieję, że obejdzie to zadanie, deklarując wyrażenie jako zmienną, ale wtedy otrzymałem wymóg "musi być stały". Obejście problemu jest interesujące, ale spróbuję tego zmienić. – AaronLS