2016-04-28 21 views
0

とプロパティを実装たぶん私は、カスタムの考え方が間違っ属性が、私はこれが可能になり、何かする必要がありますと思ったそうです。私は基本的に彼らはまた、セッターを持っては、カスタム属性

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

基本クラスのプロパティの部分文字列を取得するプロパティを持つ複数の派生クラスを持っており、実際のコードはもう少し複雑です...しかし、あなたは絵を得ました。

私はこれを何千回も実装する必要はないので、私はカスタム属性を使用することを考えていました。だから私は何ができる:

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

を私はすでに、カスタム、それのために属性を持つ:

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

今何?

答えて

0

リフレクションを使用してカスタムDataPartAttributeを処理するコードを記述する必要があります。おそらく、System.ComponentModel.DataAnnotationsの使用について考える必要があります。 EXのために

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

あなたは、あなたのオブジェクトを検証するためにObjectValidatorのインスタンスを使用することができます。

0

.NETだけではできないカスタムを返すためには、ゲッターをハイジャックする必要があります。

明らかに、PostSharpという製品(this questionへの回答を参照)を使用して実行できます。

getterにコードを入れて属性を調べ、それに応じて文字列を作成して、すべてのプロパティが完全に同じコードになるようにすることができます。 PostSharpがやることはこれだけだと思う​​。しかし、すべてのゲッターで.Substringを使用するよりもパフォーマンスが悪くなります。