也许我的自定义属性概念错了,但我认为这应该是可能的:
我有一个带字符串属性的类。我有多个派生类,其属性基本上得到了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;
}
}
现在怎么办?
答案 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
表现更差。