我有这样一个类,其中所有属性必须为可空类型。是否有可能为会话类属性添加设计(不是运行时)时间验证,以检查添加的新属性是否具有可空类型?如果属性不是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; }
}
首先,您有点不正确,因为在您的示例中,只有int?
和bool?
属性可为空。String
是一个引用类型,它可以接受null
(像任何引用类型),但它不是可空本身(在c#意义上的字)。
其次,没有任何方法来"检查"编译类型的类定义,坦率地说,这对我来说没有任何意义。您希望在某个地方对这个限制进行编码吗?如果你最终决定放弃呢?您会更改这些"约束"代码吗?但是,如果仅仅通过编辑代码就可以解除限制,那么限制的意义何在?这很像在门上装了一把锁,却把钥匙放在里面。
是的,您可以使用像Anders建议的FxCop这样的静态分析工具来解决这个问题,但是从我的角度来看,这样做的必要性突出了代码中的设计问题。创建这样的规则通常是为了在项目级别上强制执行特定的设计策略,而不是约束代码中的单个类。我对SessionInfo<T>
的作用很好奇。它会用反射检查每个属性吗?如果你能解释一下你最初的问题,我们可以帮你想出一个更好的解决方案。奇怪的重复模板模式的使用也表明你可能是那种过度解决问题的人。
你想完成什么?
首先为此编写一个自定义FxCop规则(要么硬编码该规则以仅检查Sessions类,要么使用FxCop规则将用于查找有问题的类的自定义属性)。在binarycoder上有一个关于编写自定义FxCop规则的很好的教程。下面是一个示例,其中规则检查类中每个字段的命名http://www.binarycoder.net/fxcop/html/ex_classfieldnameprefixes.html
一旦你的规则写好了,右键单击你的项目->属性。转到Code Analysis选项卡。选中"在构建时运行代码分析"。确保规则集包含您的自定义规则。
现在FxCop将对项目的每次编译运行静态代码分析,并且警告将在visual studio的"错误列表"选项卡中报告,以及编译警告。