我有这样的类,其中所有属性必须是可空类型。是否可以为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; }
}
答案 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的“错误列表”选项卡中报告警告以及编译警告。