能否将两个C#属性合并为一个?

4

我在我们公司的一个项目中使用EF6代码优先模式。在这个项目中,POCO类中有几个属性存储波斯日期信息(例如1394/01/24)。在我们的数据库中,这些值存储在“CHAR(10)”列中。

我使用字符串属性将这些值存储在我的POCO中,并且必须为每个日期属性附加“ColumnAttribute”和“StringLengthAttribute”:

public class MyPoco
{
    ...

    [Column(TypeName="CHAR")]
    [StringLength(10, MinimumLength=10)]
    public string MyDate {get; set;}

    ...
}

我很好奇是否有一种方法可以创建一个自定义属性,结合这两个属性的行为,以便我可以像这样做:

public class MyPoco
{
    ...

    [DateColumn]
    public string MyDate {get; set;}

    ...
}

"DateColumnAttribute"是一个应用于两个属性的标记,它可以减少代码输入量。


不,那不是它的工作方式。 - Florian Schmidinger
1
一个属性也是一个类...这意味着你需要多重继承来合并两者...而C#不支持这种操作。 - Florian Schmidinger
但是您应该能够创建一个新的自定义属性,具有这两个属性的语义。 - H H
1个回答

1

正如Florian所说的那样:这不是它的工作方式

属性最终是从基类Attribute派生出来的类。您要做的是创建一个新的属性(类),将属性Column和StringLength的属性结合起来。

这是不可能的,因为我们必须创建一个新的属性,它同时从两个属性派生出来,但这是不可能的,因为.NET不允许多重继承。

这也是代码风格的问题。如果您能够做到想要的,您将会隐藏原本预期的行为给开发人员。他必须打开新的属性并意识到它是两个其他属性的组合。任何使代码混淆的东西通常都被认为是不好的行为(当然,除非它增强了可读性)


谢谢您的回复。在我看来,混淆并不总是一个坏主意,特别是当它可以防止初级开发人员搞砸一切(例如通过错误地添加其中一个属性而不是两个)。 :) - Farzan Hajian
那并不完全是错的,但不要全部归咎于初级开发人员 ;) 不过在这种情况下,我建议创建一个单元测试来检查。我们曾经遇到过类似的问题。自从我们添加了一些静态检查以确保属性与属性类型等匹配后,我们解决了大部分这些问题 ;) - crazy_crank

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接