c# - 如何将泛型类型传递给新的泛型对象?

标签 c# generics unity3d

我有两个类,Character 和 Npc,它们都继承自名为“Actor”的基类。考虑以下两种基本上几乎相同的方法:

public static Dictionary<uint, Npc> drawnNpcs = new Dictionary<uint, Npc>();
public static Dictionary<uint, Character> drawnCharacters = new Dictionary<uint, Character>();

private GameObject DrawCharacter(ActorWrapper actorToDraw)
{
    GameObject obj;
    if (Data.drawnCharacters.ContainsKey(actorToDraw.Id))
    {
        Character character;
        Data.drawnCharacters.TryGetValue(actorToDraw.Id, out character);
        obj = character.gameObject;
        obj.SetActive(true);
    }
    else
    {
        obj = new GameObject("Actor");
        Character character = obj.AddComponent<Character>();
        character.Id = actorToDraw.Id;
        Data.drawnCharacters.Add(character.Id, character);
    }
    return obj;
}

private GameObject DrawNpc(ActorWrapper actorToDraw)
{
    GameObject obj;
    if (Data.drawnNpcs.ContainsKey(actorToDraw.Id))
    {
        Npc npc;
        Data.drawnNpcs.TryGetValue(actorToDraw.Id, out npc);
        obj = npc.gameObject;
        obj.SetActive(true);
    }
    else
    {
        obj = new GameObject("Actor");
        Npc npc = obj.AddComponent<Npc>();
        npc.Id = actorToDraw.Id;
        Data.drawnNpcs.Add(npc.Id, npc);
    }
    return obj;
}

我尝试实现一个通用方法,该方法采用通用字典来尝试将这两个方法合并在一起。 (我什至不确定这是否会奏效,这只是一个幼稚的第一次尝试)

private GameObject GetDrawnActor<T>(Dictionary<uint, T> drawnActors, ActorWrapper actorToDraw) where T : Actor
{
    if (drawnActors.ContainsKey(actorToDraw.Id))
    {
        T actor;
        drawnActors.TryGetValue(actorToDraw.Id, out actor);
        GameObject obj = actor.gameObject;
        obj.SetActive(true);
        return obj;
    }
    else
    {
        GameObject obj = new GameObject("Actor");
        var actor = obj.AddComponent<typeof(T)>(); //how do i do this??
        actor.Id = actorToDraw.Id;
        drawnActors.Add(actor.Id, actor);
        return obj;
    }
}

注释行是它失败的地方。

编辑:这真是愚蠢的解决方案!我修改了代码,除了答案给出的违规行之外都是正确的

最佳答案

我认为你唯一要做的就是替换它:

Character character = obj.AddComponent<typeof(T)>(); 

用这个:

Character character = obj.AddComponent<T>(); 

关于c# - 如何将泛型类型传递给新的泛型对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48222456/

相关文章:

c# - 插值对象碰撞卡住

c# - LInq left join with multiple condition in on 子句

java - 当我只有 T 时,如何返回 Interface<T> 的实例?

generics - 为什么字符串和数字有单独的比较函数/运算符?

c# - 更新到 Unity 2019.3 后无法编译 Unity WebGL

c# - 如何指定动态默认值

c# - 如何在 C# 中通过指纹查找证书

c# - 在没有外键 Entity Framework 的情况下设置一对多

c# - 如何以异步模式预加载 iframe 内容(一个 aspx 页面)以加快加载速度

java - 如何比较相同类型的泛型?