2016-04-28 21 views
0

Vielleicht Attribute falsch, ich bin das Konzept der Gewohnheit bekommen, aber ich dachte, das sollte etwas sein, das möglich wäre:Implementieren Eigenschaft mit benutzerdefinierten Attribut

Ich bin eine Klasse mit einem String-Eigenschaft. Ich habe mehrere abgeleitete Klassen mit Eigenschaften, die im Grunde eine Unterkette von der Unterkunft Basisklasse erhalten

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

sie auch eine Setter haben, und der eigentliche Code ist ein wenig komplizierter ... Aber Sie haben das Bild.

Ich möchte das nicht tausendmal implementieren müssen, also dachte ich über die Verwendung eines benutzerdefinierten Attributs nach. So konnte ich tun:

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; } 
} 

ich schon Gewohnheit für sie Attribut haben:

[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; 
    } 
} 

Was jetzt?

Antwort

0

Sie müssen Code schreiben, um Ihr benutzerdefiniertes DataPartAttribute mithilfe von Reflection zu verarbeiten.

vielleicht sollten Sie über die Verwendung von System.ComponentModel.DataAnnotations nachdenken.

Für ex)

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

Sie können dann eine Instanz von ObjectValidator benutzen, um Ihre Aufgabe zu validieren.

0

Sie müssten das Attribut Hijack den Getter, um etwas benutzerdefinierte zurückgeben, was nicht möglich ist, mit .NET allein zu tun.

Anscheinend können Sie es mit einem Produkt namens PostSharp (siehe die Antwort auf this question) tun.

Sie könnten Code in den Getter setzen, um das Attribut anzusehen und die Zeichenkette entsprechend zu erstellen, so dass jede Eigenschaft den exakt gleichen Code hätte. Ich vermute, das ist alles, was PostSharp tun würde. Aber es würde schlechter funktionieren als .Substring in jedem Getter zu verwenden.

Verwandte Themen