1

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

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; }        
}
4

2 回答 2

1

起初,您有点不正确,因为仅在您的示例中int?bool?属性是nullableString是一个引用类型,它可以接受null(像任何引用类型一样)但它本身不能为(在C# 的意义上)。

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

是的,您可以按照Anders的建议使用 FxCop 之类的静态分析器工具来解决此问题,但从我的角度来看,对此的非常需要突出了代码中的设计问题。通常创建此类规则是为了在项目级别强制执行某些设计策略,而不是限制代码中的单个类。

我很好奇他的角色SessionInfo<T>。它是否使用反射遍历每个属性?如果您解释了最初的问题,我们可以帮助您提出更好的解决方案。Curiously Recurring Template Pattern的使用也表明你可能是那种过度解决问题的人

你想达到什么目的?

于 2011-08-08T12:06:06.460 回答
0

首先为此编写一个自定义 FxCop 规则(硬编码规则以仅检查 Sessions 类,或者使用 FxCop 规则将用来查找有问题的类的自定义属性。有一个很好的关于编写自定义 FxCop 规则的教程,位于binarycoder. 这是一个示例,其中规则检查类中每个字段的命名 http://www.binarycoder.net/fxcop/html/ex_classfieldnameprefixes.html

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

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

于 2011-08-08T12:11:15.967 回答