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

Этоis можно сделать это:

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());

Вместо этого я хотел бы передать выражение в качестве параметраattribute constructor. Is it possible to do the below?

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"

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

Parameter types can change, but it is important that the attribute constructor can take that parameter and in some way be able to assign it to a field of type LambdaExpression

I want the declaration of the lambda/method to be just above the call to the attribute constructor, or inline, so that you don't have to go far to see what is being passed.

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

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

[ExpandableQueryAttribute(FuncName)]   
// ...

или же

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

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

Ответы на вопрос(4)

Ваш ответ на вопрос