从泛型类返回单例

时间:2014-03-18 10:07:12

标签: c# generics singleton

GameControl.GetControl<GameTimeControl>().Days

,其中

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

我对泛型相当新,但我想要做的是通过GetControl获取单例类,但是当我尝试启动游戏时,日志说这不是对象的实例。我不是我肯定能用单身人士做到这一点。

有没有办法通过通用方法访问大量单身人士?

好吧也许问题不够明确。让我解释一下。 我有单例模式的单例类: GameTimeControl,WeatherControl,TemperatureControl等我想在运行时访问每一个只使用一种方法,虽然它可以是一种通用的方法。所以进一步的问题是什么是最好的访问方式所有单身人士都有一种方法,如果可以的话 - 揭露他们的班级成员和方法的方法。

2 个答案:

答案 0 :(得分:1)

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

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类的新实例。您可能会将ctors设为私有,并使用某种结构方法或反射来创建实例。

只是为了说明如何使用私有构造函数实现它:

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;
}

答案 1 :(得分:0)

您可能希望在GameControl类中返回单例实例,具体取决于用于T的类型:

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

你可以像普通的单身人士(例如私人建设者)一样设计你的单数,并按你想要的方式调用GameControl.GetControl<T>()