Se es posible hacer esto:Atributo Constructor Con Lambda
public static void SomeMethod<TFunc>(Expression<TFunc> expr)
{
//LambdaExpression happily excepts any Expession<TFunc>
LambdaExpression lamb = expr;
}
y lo llaman en otros lugares pasando una lambda para el parámetro:
SomeMethod<Func<IQueryable<Person>,Person>>(p=>p.FirstOrDefault());
lugar me gustaría pasar una expresión como un parámetro para un constructor de atributo . ¿Es posible hacer lo siguiente?
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"
Mi objetivo es especificar un método o lambda en el constructor del atributo (aunque tenga que declarar un método denominado completa y pasar el nombre del método de alguna manera, que estaría bien a) .
tipos de parámetros pueden cambiar, pero es importante que el constructor atributo puede tomar ese parámetro y de alguna manera poder asignarlo a un campo de tipo LambdaExpression
Quiero que la declaración de la lambda/method está justo encima de la llamada al constructor del atributo, o en línea, para que no tenga que ir muy lejos para ver qué se está pasando.
Así que estas alternativas no habría problema, pero sin suerte conseguir que funcionen:
public static ... FuncName(...){...}
[ExpandableQueryAttribute(FuncName)]
// ...
o
//lambdas aren't allowed inline for an attribute, as far as I know
[ExpandableQueryAttribute(q => q.FirstOrDefault())]
// ...
El trabajo existente en torno es pasar un número de identificación al constructor (satisfaciendo el requisito de "argumento debe ser una constante"), que es utilizado por el constructor para hacer una búsqueda en un diccionario donde las expresiones se han agregado previamente. Estaba esperando mejorar/simplificar esto, pero tengo la sensación de que no mejora debido a las limitaciones en los constructores de atributos.
Siga su sentimiento ... la limitación de argumento atributo es bastante clara. –
La pregunta también se hizo en este enlace. La respuesta fue que actualmente no es posible. http://social.msdn.microsoft.com/Forums/en/vcsharp2008prerelease/thread/0d18c410-07b0-41cc-9c7f-9494633ca101 – Jamey
@Jamey Sí, esa es la última alternativa que enumeré, que sabía que era una limitación. Tenía la esperanza de evitarlo al declarar la expresión como una variable, pero luego el requisito "debe ser constante" me atrapó. La solución alternativa allí es interesante, y voy a probar una variación de eso. – AaronLS