在方法调用上生成编译错误的属性?

时间:2010-02-14 16:05:24

标签: c# compilation attributes

我想确保一个方法(实际上是我的构造函数)永远不会从代码中显式调用。它应该只在运行时通过反射调用。为此,我想在方法上应用一个属性,如果调用该方法会产生编译器错误,如:

[NotCallable("This method mustn't be called from code")]
public void MyMethod()
{
}

我知道我可以将该方法设为私有,但在这种情况下,我无法通过部分信任上下文中的反射来调用它...

为了完整性,这里有更多关于我为什么需要这样做的细节:

我正在实施一个基于Jon Skeet's article的可重复使用的Singleton<T>课程。到目前为止,这是我的代码:

public static class Singleton<T>
{
    public static T Instance
    {
        get
        {
            return LazyInitializer._instance;
        }
    }

    private class LazyInitializer
    {
        // Explicit static constructor to tell C# compiler
        // not to mark type as beforefieldinit
        static LazyInitializer()
        {
            Debug.WriteLine(string.Format("Initializing singleton instance of type '{0}'", typeof(T).FullName));
        }

        internal static readonly T _instance = (T)Activator.CreateInstance(typeof(T), true);
    }
}

(请注意我使用Activator.CreateInstance创建T实例的方式)

然后我可以将它用于这样的类:

private class Foo
{
    protected Foo()
    {
    }

    public string Bar { get; private set; }
}

并致电Singleton<Foo>.Instance以访问该实例。

在部分信任中,它不起作用,因为Foo构造函数不公开。但是,如果我公开它,没有什么可以阻止从代码中明确地调用它...我知道我可以在ObsoleteAttribute构造函数上应用Foo,但它只会生成一个警告,很多人只是忽略警告。

那么,是否存在类似于ObsoleteAttribute的属性会产生错误而不是警告?

任何建议都将不胜感激

1 个答案:

答案 0 :(得分:7)

您可以使用带有布尔值的ObsoleteAttribute constructor,您可以指示调用该方法是编译错误:

[Obsolete("Don't use this", true)]

但是,如果我是你,我会重新考虑我的设计,因为这样做不是设计良好的API的标志。