我想確保一個方法(實際上是我的情況下的構造函數)永遠不會從代碼明確調用。它只能在運行時通過反射來調用。爲了做到這一點,我想申請上會產生一個編譯器錯誤的方法的屬性,如果該方法被調用,這樣的:在方法調用中生成編譯錯誤的屬性?
[NotCallable("This method mustn't be called from code")]
public void MyMethod()
{
}
我知道我可以做的方法私有的,但在這種情況下,我將無法在部分信任上下文來調用它通過反射...
爲了完整起見,這裏就是爲什麼我需要做的更多細節:
我實現一個可重用的Singleton<T>
類,基於Jon Skeet's article。這裏是我到目前爲止的代碼:
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
構造函數不公開。但是如果我公開它,沒有任何東西可以防止從代碼中明確地調用它...我知道我可以在Foo
構造函數上應用ObsoleteAttribute
,但它只會生成警告,並且許多人只是忽略警告。
那麼,是否有類似於ObsoleteAttribute
的屬性會產生錯誤而不是警告?
任何建議,將不勝感激
哦,我從來沒有注意到這個參數......謝謝!關於設計,我同意這並不理想。這樣做的「正常」方式是將構造函數聲明爲非公開的。只有在代碼將以部分信任運行時,纔會使用使用ObsoleteAttribute的解決方法。 – 2010-02-14 17:33:16