2017-10-18 81 views
-3

我想要使用一個必須包含全局變量的靜態類,所以我可以簡單地從一個變量訪問所有應用程序控件。 其實我已經這樣實施:如何從靜態類返回類實例?

public static class Globals 
{ 
    public static HeadToHead Head2Head 
    { 
     get { return Resources.Controls.HeadToHead; } 
    } 
} 
中,我想回 HeadToHead控制的實例之上的情況下

,控制這個樣子:

public partial class HeadToHead : UserControl 
{ 
    public static int HomeId = 0; 

} 

我的目標是進入靜態這種控制的變量,如:Globals.Head2Head.HomeId

,但我得到這一行此錯誤:get { return Resources.Controls.HeadToHead; }

HeadToHead is a type which is not valid in the given context

+1

爲什麼客戶端不會直接使用'Resources.Controls.HeadToHead.HomeId'(或其他靜態屬性)的任何原因? –

+0

如果你真的想返回控件,你將不得不創建它的一個實例,如下所示:'public static HeadToHead Head2Head => new HeadToHead();' –

回答

0

您正在返回看起來像是聲明該類型實例的屬性的類型。如果你真的想要返回那種類型,那就是這樣的語法(我不記得了,我認爲在c#中它是classname.type)。如果你想返回一個實例,那麼你需要從某個地方獲取該實例。

另外,UI控件的靜態實例是一個糟糕的主意,也是一種代碼異味。

0

你必須實例化一個類型的實例並返回它。正如你想要一個單一的全局實例,你可以使用靜態構造函數。

public static class Globals { 

    static Globals(){ 
     Head2Head = new Resources.Controls.HeadToHead(); 
    } 

    public static HeadToHead Head2Head { get; private set; } 
} 

有些情況下,你會真的想這樣做,但普遍沒有在應用程序的生命改變可能是其中的一個靜態設置的幾種情況。由於HeadToHead繼承自UserControl,實際上並非如此,因此UserControl的一個實例理想情況下永遠不會是靜態的。

+0

錯誤是固定的,但是當我輸入:Globals。 Head2Head.HomeId'我得到另一個錯誤:'不能使用實例引用進行訪問,而是使用類型名稱來限定它'爲什麼?謝謝 – stamaaaa

+0

@stamaaaa - 應該使用類型名稱而不是實例來訪問在類型中聲明爲「const」的字段。如果您想在實例上訪問它,請將其從「const」更改爲「readonly」,以便可以讀取但不能更改。 'public readonly int HomeId = 0;' – Igor