Конструктор атрибутов с лямбдой

Можно сделать это:

public static void SomeMethod<TFunc>(Expression<TFunc> expr)
{
    //LambdaExpression happily excepts any Expession<TFunc>
    LambdaExpression lamb = expr;
}

и вызвать его в другом месте, передав лямбда для параметра:

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"

Моя цель — указать метод или лямбду в конструкторе атрибута (даже если мне придется объявить метод с полным именем и каким-то образом передать имя метода, это будет нормально).

  1. Типы параметров могут меняться, но важно, чтобы конструктор атрибутов мог принимать этот параметр и каким-то образом присваивать его полю типа LambdaExpression

  2. Я хочу, чтобы объявление лямбда/метода было просто над вызовом конструктора атрибута или встроенным, чтобы вам не нужно было далеко ходить, чтобы увидеть, что передается.

Таким образом, эти альтернативы были бы хороши, но не повезло заставить их работать:

public static ... FuncName(...){...}

[ExpandableQueryAttribute(FuncName)]   
// ...

или

//lambdas aren't allowed inline for an attribute, as far as I know
[ExpandableQueryAttribute(q => q.FirstOrDefault())]   
// ...

Существующий обходной путь заключается в передаче числового идентификатора в конструктор (удовлетворение требования «аргумент должен быть постоянным») , который используется конструктором для поиска в словаре, в который ранее были добавлены выражения. Надеялся улучшить/упростить это, но у меня такое ощущение, что лучше не станет из-за ограничений конструкторов атрибутов.

10
задан Linus Caldwell 11 June 2013 в 07:06
поделиться