gpt4 book ai didi

c# - 从类型和实例的字典中获取实例

转载 作者:太空狗 更新时间:2023-10-29 21:43:16 25 4
gpt4 key购买 nike

我有一个名为 ServiceManager 的简单服务管理器,它有两个方法。 Create() 创建一个服务实例。 Provide() 返回之前创建的服务。

我有一个有效的基本实现,但我想知道是否有更简洁的方法。这是我对 ServiceManager 的基本实现:

public class ServiceManager : MonoBehaviour
{
private Dictionary<Type, MonoBehaviour> services = new Dictionary<Type, MonoBehaviour>();

public void Create<T>() where T : MonoBehaviour
{
// Create service
GameObject serviceObject = new GameObject(typeof(T).Name);
serviceObject.transform.SetParent(transform); // make service GO our child
T service = serviceObject.AddComponent<T>(); // attach service to GO

// Register service
services.Add(typeof(T), service);
}

public T Provide<T>() where T : MonoBehaviour
{
return (T)services[typeof(T)]; // notice the cast to T here
}
}

使用该服务很简单:

public class ServiceTest : MonoBehaviour
{
private void Start()
{
// Creating services
ServiceManager services = FindObjectOfType<ServiceManager>();
services.Create<MapService>();
services.Create<InteractionService>();
}

private void Example()
{
// Get a service
ServiceManager services = FindObjectOfType<ServiceManager>();
MapService map = services.Provide<MapService>();
// do whatever you want with map
}
}

我的问题是关于 ServiceManager.Provide()。注意从字典中获取项目后转换为 T。这感觉非常不干净,让我想知道我是否遗漏了一些关于泛型在 C# 中的工作原理。是否有其他/更好的方法来完成我想要完成的事情?

最佳答案

这里没有什么可以改进的。强制转换是必需的,因为字典值类型是 MonoBehaviour知道它实际上是T,但编译器不知道。你必须通过类型转换来说明这一点。

你做得很好。

关于c# - 从类型和实例的字典中获取实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43545346/

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