[英]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.