Lambda expression dans l'attribut constructeur

J'ai créé un Attribute classe appelée RelatedPropertyAttribute:

[AttributeUsage(AttributeTargets.Property)]
public class RelatedPropertyAttribute: Attribute
{
    public string RelatedProperty { get; private set; }

    public RelatedPropertyAttribute(string relatedProperty)
    {
        RelatedProperty = relatedProperty;
    }
}

Je l'utilise pour indiquer des propriétés connexes dans une classe. Exemple de la façon dont je voudrais l'utiliser:

public class MyClass
{
    public int EmployeeID { get; set; }

    [RelatedProperty("EmployeeID")]
    public int EmployeeNumber { get; set; }
}

Je voudrais utiliser des expressions lambda afin que je puisse passer d'un type fort dans mon attribut du constructeur, et non pas un "la magie de la chaîne". De cette façon, je peux exploiter compilateur vérification de type. Par exemple:

public class MyClass
{
    public int EmployeeID { get; set; }

    [RelatedProperty(x => x.EmployeeID)]
    public int EmployeeNumber { get; set; }
}

J'ai pensé que je pouvais le faire avec la suite, mais il n'est pas permis par le compilateur:

public RelatedPropertyAttribute<TProperty>(Expression<Func<MyClass, TProperty>> propertyExpression)
{ ... }

Erreur:

La non-générique de type "RelatedPropertyAttribute' ne peut pas être utilisé avec
les arguments de type

Comment puis-je y parvenir?

  • essayez de faire la classe générique..au lieu de le seul constructeur.
  • Je pense que paramètre d'attribut sont limitées à compile-time constants, typeof expression or array creation expression of an attribute parameter type. Vous ne pouvez pas passer même de Décimales comme paramètre. Jetez un oeil à stackoverflow.com/questions/11004909/...
  • Un type générique ne peut pas dériver de "Attribut" parce que c'est un attribut de la classe
  • Peut-être un outil comme [PostSharp][postsharp.net/] peut vous aider à le résoudre. Il peut être intégré dans le processus de génération pour générer du code, avant l' .NET Compilateur est exécutée.
  • N'ont pas le temps pour une réponse complète, mais un moyen d'atteindre votre objectif final sera de: faire de la classe une liste statique de Tuple<,>s de Expression<Func<class,object>>s; chaque entrée de cette liste est un tuple de getters de propriétés liées. C'est ensuite au moment de la compilation forte, et aussi interrogable au moment de l'exécution.
InformationsquelleAutor Dave New | 2013-05-29