2017-11-18 38 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对象供应用程序中的所有类使用。我如何传递对这个对象的引用来在另一个类的静态方法中使用它? –