2016-04-28 46 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更糟糕。