E è possibile fare questo:Attributo costruttore con Lambda
public static void SomeMethod<TFunc>(Expression<TFunc> expr)
{
//LambdaExpression happily excepts any Expession<TFunc>
LambdaExpression lamb = expr;
}
e chiamarlo passando altrove un lambda per il parametro:
SomeMethod<Func<IQueryable<Person>,Person>>(p=>p.FirstOrDefault());
avrei invece vuole passare un'espressione come un parametro per un costruttore di attributi . È possibile fare il seguito?
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"
Il mio obiettivo è quello di indicare un metodo o lambda nel costruttore dell'attributo (anche se devo dichiarare un metodo chiamato pieno e passare il nome del metodo in qualche modo, che sarebbe bene per) .
Tipi di parametri possono cambiare, ma è importante che il costruttore attributo può prendere quel parametro e in qualche modo essere in grado di assegnarlo a un campo di tipo LambdaExpression
Voglio la dichiarazione del lambda/metodo deve essere appena sopra la chiamata al costruttore di attributi, o inline, in modo da non dover andare lontano per vedere cosa viene passato.
Quindi queste alternative andrebbe bene, ma senza fortuna inducendole a lavorare:
public static ... FuncName(...){...}
[ExpandableQueryAttribute(FuncName)]
// ...
o
//lambdas aren't allowed inline for an attribute, as far as I know
[ExpandableQueryAttribute(q => q.FirstOrDefault())]
// ...
Il lavoro esistente intorno è quello di passare un numero ID al costruttore (soddisfare il requisito "l'argomento deve essere costante"), che viene utilizzato dal costruttore per eseguire una ricerca in un dizionario in cui le espressioni sono state aggiunte in precedenza. Speravo di migliorare/semplificare questo, ma ho la sensazione che non migliori grazie alle limitazioni sui costruttori di attributi.
Segui il tuo sentimento ... la limitazione sull'argomento attributo è piuttosto chiara. –
La domanda è stata anche posta a questo link. La risposta è stata che non è attualmente possibile. http://social.msdn.microsoft.com/Forums/en/vcsharp2008prerelease/thread/0d18c410-07b0-41cc-9c7f-9494633ca101 – Jamey
@Jamey Sì, questa è l'ultima alternativa che ho elencato che sapevo essere una limitazione. Speravo di aggirare questo dichiarando l'espressione come una variabile, ma poi il requisito "deve essere costante" mi ha preso. Comunque, la soluzione è interessante, e ho intenzione di provare una variazione di questo. – AaronLS