我可以将类型约束为仅包含可空属性吗?

时间:2011-08-08 12:00:13

标签: c# validation class reflection crtp

我有这样的类,其中所有属性必须是可空类型。是否可以为Sessions类属性添加设计(而不是运行时)时间验证以检查是否添加了新属性具有可空类型?如果属性不具有nulable类型,编译器应该给出错误而不编译代码。

public class Sessions : SessionInfo<Sessions>
{
    public int? UserId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public string OldEmail { get; set; }
    public bool? UserManager { get; set; }
    public bool? UserManagerVisible { get; set; }
    public bool? TransactionCall { get; set; }        
}

2 个答案:

答案 0 :(得分:1)

首先,您稍微不正确,因为在您的示例中,只有int?bool?属性可以为空String引用类型,它可以接受null(与任何引用类型一样),但它本身不是可空(在{ {3}})。

其次,不,没有任何方法可以在编译类型中“检查”类定义,坦率地说,这对我没有任何意义。你是否希望在某个地方编码这个限制?那么如果你决定最终放弃呢?你会改变这个“约束”代码吗?但是,如果可以通过编辑代码来解除限制,那么限制的重点是什么?这就像在门上安装锁只是为了保持钥匙一样。

是的,您可以使用像{FxCop这样的静态分析工具C# sense of the word来解决这个问题,但从我的角度来看,这需要强调您的设计问题码。通常会创建此类规则以在项目级别强制执行某些设计策略,而不是限制代码中的单个类。

我很好奇SessionInfo<T>的角色。是用反射覆盖每个房产吗?如果您解释了原始问题,我们可以帮助您找到更好的解决方案。 suggested by Anders的使用也表明您可能是Curiously Recurring Template Pattern

你想要完成什么?

答案 1 :(得分:0)

首先为此编写自定义FxCop规则(硬编码规则仅检查Sessions类,或使用FxCop规则将用于查找相关类的自定义属性。 有一个关于在二进制编码器上编写自定义FxCop规则的好教程。以下是规则检查类中每个字段的命名的示例 http://www.binarycoder.net/fxcop/html/ex_classfieldnameprefixes.html

编写规则后,右键单击您的项目 - &gt;属性。转到“代码分析”选项卡。选中“在构建时运行代码分析”。确保规则集包含您的自定义规则。

现在FxCop将在项目的每次编译时运行静态代码分析,并且将在visual studio的“错误列表”选项卡中报告警告以及编译警告。