2016-04-28 2 views
0

Peut-être que je reçois le concept de Attributs personnalisés mal, mais je pensais que cela devrait être quelque chose qui serait possible:Mettre en oeuvre la propriété avec attribut personnalisé

Je vais avoir une classe avec une propriété de chaîne. Je dispose de plusieurs classes dérivées avec des propriétés qui essentiellement obtenir une sous-chaîne de la propriété BaseClass

class BaseClass { 
    public string MyString { get; set;} 
} 

class FooClass : BaseClass { 
    public string Part1 { get { return MyString.SubString(0,3); }} 
    public string Part2 { get { return MyString.SubString(3,5); }} 
} 

class BarClass : BaseClass { 
    public string PartA { get { return MyString.SubString(0,4); }} 
    public string PartB { get { return MyString.SubString(4,1); }} 
} 

Ils ont aussi un setters, et le code réel est plus complexe un peu ... Mais vous avez obtenu l'image. Je voudrais ne pas avoir à implémenter cela un millier de fois, donc je pensais utiliser un attribut personnalisé. Alors que je pouvais faire:

class FooClass : BaseClass { 
    [DataPart(0, Length = 3)] 
    public string Part1 { get; set; } 
    [DataPart(3, Length = 5)] 
    public string Part2 { get; set; } 
} 

class BarClass : BaseClass { 
    [DataPart(4, Length = 4)] 
    public string PartA { get; set; } 
    [DataPart(4)] 
    public string PartB { get; set; } 
} 

Je l'ai déjà attribut personnalisé pour elle:

[global::System.AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] 
sealed class DataPartAttribute : Attribute 
{ 
    public ushort Position { get; private set; } 
    public ushort Length { get; set; } 

    public DataByteAttribute(ushort position) 
    { 
     Position = position; 
    } 
} 

Et maintenant?

Répondre

0

Vous devez écrire du code pour traiter votre DataPartAttribute personnalisé à l'aide de la réflexion. Peut-être, vous devriez penser à utiliser System.ComponentModel.DataAnnotations.

Ex)

[StringLength(100, MinimumLength =30)] 
    public string Description { get; set; } 

vous pouvez utiliser une instance de ObjectValidator pour valider votre objet.

0

Vous devez avoir l'attribut pirater le getter pour retourner quelque chose de personnalisé, ce qui n'est pas possible avec .NET seul.

Apparemment, vous pouvez le faire avec un produit appelé PostSharp (voir la réponse à this question).

Vous pourriez mettre du code dans le getter pour regarder l'attribut et construire la chaîne en conséquence, de sorte que chaque propriété ait exactement le même code. Je suppose que c'est tout ce que PostSharp ferait. Mais ce serait pire que d'utiliser .Substring dans chaque getter.