如果多个成员具有相同的属性,如何抛出编译器错误

时间:2011-06-07 13:37:25

标签: c# .net .net-4.0 attributes compiler-errors

简单的问题,如何强制C#编译器抛出编译错误。


更新:或许最好使用Assert.Fail()

我有一个自定义属性,只能应用于一个类的一个成员。在我的另一个类'静态方法中,它查找那个成员,如果有多个成员应用了该属性,我希望它失败(不抛出异常)。

public class Foo
{
    [MyCustomAttribute]
    public String FooString { get; set; }

    [MyCustomAttribute]
    public String OtherFooString { get; set; }
}


public class Bar<T>
    where T : class, new()
{
    static Bar()
    {
         //If more than one member of type Foo has MyCustomAttribute
         //applied to it compile error or Assert.Fail()?
    }
}

4 个答案:

答案 0 :(得分:26)

您可以使用诊断指令:

#error Oops. This is an error.

或只是警告:

#warning This is just a warning.

你通常希望将它们放在条件块中,我希望......

编辑:好的,现在你已经更新了你的问题,你根本无法在编译时这样做。您使用Assert.Fail的建议将问题归结为执行时间。

我建议您编写单元测试以检测此问题(迭代程序集中的所有类型,并检查该属性是否每种类型最多只应用一次)。

编辑:2016年......虽然OP建议的代码分析实际上不是编译器错误,但现在Visual Studio使用Roslyn,可以挂钩编译器并真正获得编译器出错,使用Roslyn代码分析器。但是,我仍然个人更喜欢单元测试,因为代码可以由任何人构建和测试,无论他们是否安装了Roslyn分析器。仍然没有办法用“纯粹的香草”C#编译器验证这一点。

答案 1 :(得分:4)

在提出这个问题一年多之后,我意识到了单元测试的另一种解决方案:代码分析。

如果不存在代码分析规则,您甚至可以roll your own。只需确保将规则设置为“错误”而不是“警告”(或确保将警告视为错误)。这是该屏幕的图像:

Code Analysis Error

当然,我仍然倾向于在这种特殊情况下使用单元测试,但我绝对可以看到代码分析作为替代解决方案,特别是对于自定义命名等事情(即我的所有类应该以'Foo'结尾或者抛出错误)。

答案 2 :(得分:2)

简单答案:要求它编译语法无效的东西。

答案 3 :(得分:1)

我不相信这可以做到,因为无法告诉编译器检查自定义错误。当然,你可以像Jon说的那样使用#error,但是没有办法自己添加条件。因为#error每次都会导致错误。

唯一可以肯定的是在运行时检查然后抛出异常。

编辑:该死的,在经过大量编辑后开始质疑。