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

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

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

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

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

我正在实现一个可重用的Singleton类,基于Jon Skeet的文章 。 到目前为止,这是我的代码:

 public static class Singleton { 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.Instance来访问实例。

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

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

任何建议将不胜感激

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

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

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