使用自定义属性

时间:2016-04-28 16:11:49

标签: c# custom-attributes

也许我的自定义属性概念错了,但我认为这应该是可能的:

我有一个带字符串属性的类。我有多个派生类,其属性基本上得到了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); }}
}

他们也有一个制定者,真正的代码有点复杂......但是你得到了图片。

我不想实现这一千次,所以我想使用自定义属性。所以我能做到:

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

现在怎么办?

2 个答案:

答案 0 :(得分:0)

您需要编写代码以使用反射处理自定义DataPartAttribute。

或许,您应该考虑使用System.ComponentModel.DataAnnotations。

对于前)

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

然后,您可以使用ObjectValidator的实例来验证您的对象。

答案 1 :(得分:0)

您需要让属性劫持getter才能返回自定义内容,而单独使用.NET是不可能的。

显然你可以使用名为PostSharp的产品来做到这一点(参见this question的答案)。

您可以将代码放在getter中以查看属性并相应地构建字符串,以便每个属性都具有完全相同的代码。我怀疑这就是PostSharp所做的一切。但它会比在每个getter中使用.Substring表现更差。