我想确保一个方法(实际上是我的构造函数)永远不会从代码中显式调用。它应该只在运行时通过反射调用。为此,我想在方法上应用一个属性,如果调用该方法会产生编译器错误,如:
[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
的属性会产生错误而不是警告?
任何建议都将不胜感激
答案 0 :(得分:7)
您可以使用带有布尔值的ObsoleteAttribute constructor,您可以指示调用该方法是编译错误:
[Obsolete("Don't use this", true)]
但是,如果我是你,我会重新考虑我的设计,因为这样做不是设计良好的API的标志。