2010-02-14 44 views
4

我想確保一個方法(實際上是我的情況下的構造函數)永遠不會從代碼明確調用。它只能在運行時通過反射來調用。爲了做到這一點,我想申請上會產生一個編譯器錯誤的方法的屬性,如果該方法被調用,這樣的:在方法調用中生成編譯錯誤的屬性?

[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的屬性會產生錯誤而不是警告?

任何建議,將不勝感激

回答

7

您可以使用,需要一個布爾值,使用它可以表明調用的方法是一個編譯錯誤的ObsoleteAttribute constructor

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

不過,如果我是你,我會重新考慮我的設計,因爲這樣做不是設計良好的API的標誌。

+0

哦,我從來沒有注意到這個參數......謝謝!關於設計,我同意這並不理想。這樣做的「正常」方式是將構造函數聲明爲非公開的。只有在代碼將以部分信任運行時,纔會使用使用ObsoleteAttribute的解決方法。 – 2010-02-14 17:33:16