2016-04-28 74 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。

對於前)

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

然後你可以使用ObjectValidator的實例來驗證你的對象。

0

您需要擁有屬性劫持getter才能返回一些自定義的內容,而這不可能僅用於.NET。

顯然,您可以使用名爲PostSharp的產品執行此操作(請參閱this question的答案)。

您可以將代碼放在getter中查看屬性並相應地構建字符串,以便每個屬性都具有完全相同的代碼。我懷疑這是PostSharp會做的。但它會比在每個吸氣劑中使用.Substring更糟糕。