2017-11-18 39 views
-1

在我的課有幾種方法具有以下簽名:初始化靜態字段,然後再調用在C#中的任何靜態方法

public static void SomeMethod() 
{ 
... 
} 

這些方法大多依賴於私有靜態字段的值。 在調用這些靜態方法之前,調用方必須有任何方法爲該字段賦值。

我想有一個單獨的隨機對象供應用程序中的所有類使用。我如何傳遞對這個對象的引用來在另一個類的靜態方法中使用它? 我與靜態方法和靜態初始化類中的私有靜態字段:

public static void Init(Random random) 
{ 
    _random = random; 
} 

但是,如何確保初始化被稱爲?爲了在每種方法中進行檢查並拋出異常,對我來說似乎是多餘的。可能有另一種選擇。

終於讓我找到了我一個可接受的解決方案:

  1. 定義中包含應用程序入口點的類公共靜態屬性:public static Random Rnd { get; } = new Random();

  2. 在其他類別定義private static Random _random;

  3. 爲包括該代碼的其他類實現靜態構造函數:

    Type type = Assembly.GetExecutingAssembly().EntryPoint.DeclaringType; 
        var randomTypeProperties = 
         type.GetProperties().Where(p => p.PropertyType == typeof(Random)); 
        foreach (var propertyInfo in randomTypeProperties) 
        { 
         _random = (Random)propertyInfo.GetValue(null); 
        } 
    

我可以標記從@Andy消息作爲答案,因爲它是所有靜態構造函數後。

謝謝大家參與討論。


學習永遠不嫌晚。昨天,當我讀到的設計模式,我意識到Singlton是正是我需要的:

public sealed class RandomAsSingleton : Random 
{ 
    private static volatile RandomAsSingleton _instance; 
    private static readonly object _syncRoot = new object(); 

    private RandomAsSingleton() { } 

    public static RandomAsSingleton Instance 
    { 
     get 
     { 
      lock (_syncRoot) 
      { 
       if (ReferenceEquals(_instance, null)) { _instance = new RandomAsSingleton(); } 
       return _instance; 
      } 
     } 
    } 
} 

我以前的解決方案,現在在我看來有點難看。

+0

我想我的問題有一個區別:一個靜態構造函數沒有參數。 –

+1

這聽起來像你應該重新考慮設計。使它們成爲* instance *方法,並只公開一個接受該字段初始值的構造函數。然後創建該對象的單個實例,並在需要的任何地方使用該實例(例如,使用DI)。 –

+0

最後我找到了適合我的解決方案: 1.在包含應用程序入口點的類中定義公共靜態屬性: public static Random Rnd {get; } = new Random(); 2.在其他類中定義private static Random _random; –

回答

0

你可能想使用一個靜態構造函數

// Static constructor is called at most one time, before any 
// instance constructor is invoked or member is accessed. 
static SimpleClass() 
{ 
    // set your private static field 
} 

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/static-constructors

+0

我知道靜態構造函數。但在我的情況下,靜態字段的值取決於外部代碼。 –

+1

那麼這不是靜態的,向我們展示示例。你的問題太廣泛,所以它的重複。如果你認爲你的問題不同,請詳細說明,以顯示不同之處。更加詳細一些。 @ retrograde.su –

+0

更詳細地說,我想要一個單獨的Random對象供應用程序中的所有類使用。我如何傳遞對這個對象的引用來在另一個類的靜態方法中使用它? –