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).
-
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
-
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?
Du musst angemeldet sein, um einen Kommentar abzugeben.
wie wäre es damit:
diesem lassen sollte ordnen Sie Ihren lambda auf ein Feld und dann saugen Sie es in runtime, obwohl im Allgemeinen ich würde lieber so etwas wie PostSharp zu tun, dies zur compile-Zeit.
einfaches Beispiel
Ist dies nicht möglich, kann man da was passieren, in ein Attribut braucht, um fit in die CLR ist binäre DLL-format und es gibt keine Möglichkeit zum codieren beliebigen Objekt-Initialisierung. Für die gleichen Sie können nicht passieren Sie eine nullable-Wert für Beispiel. Die Einschränkungen sind sehr streng.
Obwohl Sie keinen Konstruktor für komplexe Attribute, in einigen situation eine Arbeit-aound ist eine öffentliche Eigenschaft für das Attribut, und aktualisieren Sie es auf run-time.
selbst zeigen Sie auf ein Objekt der Klasse enthält einige Attribute, die auf seine Eigenschaften. LocalDisplayNameAttribute ist ein benutzerdefiniertes Attribut.
Dem folgenden code wird festgelegt ResourceKey Eigenschaft meiner benutzerdefinierten Attribut Klasse zur Laufzeit. Dann, an dem Punkt, den Sie überschreiben können DisplayName zu outpiut Sie, was text Sie wollen.
Verwenden dynamische linq: http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx
Können Sie die attribute der Konstruktor einen string, das wertet einen Ausdruck.