繁体   English   中英

从泛型类返回单例

[英]return a singleton from generic class

GameControl.GetControl<GameTimeControl>().Days

哪里

public static class GameControl
{
    public static T GetControl<T>()
    {
        T result = default(T);
        return result;
    }
}

我对泛型不是很熟悉,但是我想做的是通过GetControl获取单例类,但是当我尝试启动游戏时,日志显示这不是对象的实例。我不确定是否可以单身人士做到这一点。

有没有一种方法可以通过通用方法访问很多单例?

好吧,也许这个问题还不够清楚。让我更好地解释一下。 我有具有单例模式的单例类:GameTimeControl,WeatherControl,TemperatureControl等。我只想在运行时使用一个方法访问它们中的每个方法 ,尽管它可以是通用方法。所以进一步的问题是最好的一种方法(如果可以)访问所有单例的方法-公开其类成员和方法的方法。

为了进一步扩展其他建议,您需要保留一个已创建实例的列表,如果请求一个新实例,则需要创建一个实例:

static Dictionary<Type, object> instances = new Dictionary<Type, object>();
public static T GetControl<T> where T: new() {
  T retVal = default(T);
  if (instances.ContainsKey(typeof(T)))
  {
    retVal = (T)instances[typeof(T)];
  }
  else
  {
    retVal = new T();
    instances.Add(typeof(T), retVal);
  }

  return retVal;
}

注意:这是一个非常简单的版本,并不禁止创建T类的新实例。 您可能会将ctor设为私有,并使用某种构造方法或反射来创建实例。

只是为了展示如何使用私有构造函数来实现它:

static Dictionary<Type, object> instances = new Dictionary<Type, object>();
public static T GetControl<T> {
  T retVal = default(T);
  if (instances.ContainsKey(typeof(T)))
  {
    retVal = (T)instances[typeof(T)];
  }
  else
  {
    Type t = typeof(T);

    ConstructorInfo ci = t.GetConstructor(
      BindingFlags.Instance | BindingFlags.NonPublic,
      null, paramTypes, null);

    retVal = (T)ci.Invoke(null); // parameterless ctor needed
    instances.Add(typeof(T), retVal);
  }

  return retVal;
}

您可能需要根据T的类型返回GameControl类中的单例实例:

public static class GameControl
{
    public static T GetControl<T>()
    {
        if(typeof(T) == typeof(GameTimeControl)
        {
            return GameTimeControl.Instance();
        }
        // TODO: other singletons
        return null;
    }
}

您可以像普通单例一样设计singlton(例如,私有构造函数),然后根据需要调用GameControl.GetControl<T>()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM