Attribut, Konstruktor Mit Lambda

Es ist möglich, dies zu tun:

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

und nennen es anderswo übergabe eines lambda für die parameter:

SomeMethod<Func<IQueryable<Person>,Person>>( p=>p.FirstOrDefault());

Ich würde stattdessen gerne weitergeben, einen Ausdruck als parameter, um eine Attribut, Konstruktor.
Ist es möglich, die unten?

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"

Mein Ziel ist, geben Sie eine Methode oder ein lambda-Ausdruck im Konstruktor das Attribut(auch wenn ich zu erklären, eine vollständige namens-Methode und übergeben Sie den Namen der Methode irgendwie in Ordnung sein würde, zu).

  1. Parameter-Typen können sich ändern, aber es ist wichtig, dass das Attribut, Konstruktor können parameter und in irgendeiner Weise in der Lage sein, die Zuweisung an ein Feld des Typs LambdaExpression

  2. Möchte ich die Erklärung von lambda/Methode werden nur über den Aufruf des Attribut, Konstruktor, oder inline, so dass Sie nicht haben, um weit zu gehen, um zu sehen, was übergeben wird.

Also diese alternativen wäre gut, aber kein Glück Sie zu arbeiten:

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

[ExpandableQueryAttribute(FuncName)]   
//...

oder

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

Dem vorhandenen umgehen, ist eine Zahl übergeben-ID im Konstruktor(Erfüllung der "argument muss eine Konstante Voraussetzung"), die verwendet wird durch den Konstruktor zu tun, eine Suche in einem Wörterbuch, wo Ausdrücke wurden Hinzugefügt bislang. Hatte gehofft, zu verbessern/vereinfachen, aber ich habe das Gefühl es wird nicht besser, aufgrund von Einschränkungen, die auf Attribut-Konstruktoren.

  • Folgen Sie Ihrem Gefühl... die Beschränkung der Attribut-argument ist ziemlich klar.
  • Die Frage wurde auch gebeten, unter diesem link. Die Antwort war, dass es zur Zeit nicht möglich. social.msdn.microsoft.com/Forums/en/vcsharp2008prerelease/...
  • Yep, das ist die Letzte alternative, die ich aufgeführt was ich kannte, war eine Einschränkung. Hatte gehofft, das umgehen, indem Sie erklärt den Ausdruck wie eine variable, aber dann "muss konstant sein" - Anforderung hat mich. Die Problemumgehung es ist interessant, obwohl, und ich werde versuchen, eine Variante, die.
  • möglich, Duplikat der C# Method-Attribut enthalten, nicht ein Lambda-Ausdruck?
InformationsquelleAutor AaronLS | 2012-06-12
Schreibe einen Kommentar