gpt4 book ai didi

c# - 从泛型类返回一个单例

转载 作者:太空宇宙 更新时间:2023-11-03 13:25:53 24 4
gpt4 key购买 nike

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

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

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

关于c# - 从泛型类返回一个单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22476030/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com