【问题标题】:Pass A Generic (Template) Class For Runtime Initialization传递一个通用(模板)类进行运行时初始化
【发布时间】:2015-08-14 04:16:07
【问题描述】:

现在我有一个数据库,它初始化了一大堆卡片类型,如下所示:

private void LoadCardTypes()
{
    database.cardTypeList.Clear();
    database.cardTypeMap.Clear();
    Object[] assets = Resources.LoadAll("ScriptableObjects/CardTypes", typeof(Object)) as Object[];
    if (showLog) Debug.Log("Loading CardTypes");
    foreach (Object asset in assets)
    {
        M_CardPlayType type = (M_CardPlayType)asset;

        if (type.name.Length == 0)
        {
            Debug.Log("WARNING: Object Mapped Without Name");
        }

        CheckIdCollision(type, database.cardMap);
        VerifyIdExists(type, CardPlayTypes.SINGLETON);

        database.cardTypeList.Add(type);
        database.cardTypeMap.Add(type.id, type);
    }
}

代码的去向M_CardPlayType type = (M_CardPlayType)asset; 我想让它成为模板类型。

我希望它是这样的

private void LoadCardTypes(Type<T> WhateverType)
{
  //other code
  WhateverType type = (WhateverType)asset;
  //other code
  VerifyIdExists(type, WhateverType.SINGLETON);
}

这可以吗? (还有一个额外的问题,如果有一种技术叫什么?)。

更新工作,除了 1 部分

新签名是

private void LoadNewCardTypes<T,P>(DictionaryOfIntAndSerializableObject map, List<T> list, string path) where T : M_Object where P : ID

我的 P 给我带来了麻烦。这是我的 ID 类

public class ID
{
    protected string _className = "ID";
    protected static ID _singleton = new ID();

    public static ID SINGLETON
    {
        get { return _singleton; }
    }
}

当我尝试从 P 获取单例时出现错误(找不到)

P.SINGLETON//doesnt work

你知道为什么我的单例不能在这种情况下工作吗?

感谢@kailanjian 的最终解决方案

private void LoadNewCardTypes<T,P>(DictionaryOfIntAndSerializableObject map, List<T> list, string path) where T : M_Object where P : ID
{
    map.Clear();
    list.Clear();
    Object[] assets = Resources.LoadAll(path, typeof(Object)) as Object[];
    if (showLog) Debug.Log("Loading " + path + " types");
    foreach (Object asset in assets)
    {
        T type = (T)asset;

        if (type.name.Length == 0)
        {
            Debug.Log("WARNING: Object Mapped Without Name");
        }

        CheckIdCollision(type, map);
        VerifyIdExists(type, (P)ID.SINGLETON);
    }

【问题讨论】:

    标签: c# templates generics runtime


    【解决方案1】:

    试试这样的:

    private void LoadCardTypes<T>() where T : ParentClass
    {
        //other code
        T type = (T)asset;
        //other code
        VerifyIdExists(type, T.SINGLETON);
    }
    

    ParentClass 是您保证被您传递的任何类型T 继承/实现的类型。它应该具有 SINGLETON 值作为其值之一,以便您能够使用它。

    来源:MSDN Generic Methods

    【讨论】:

    • 您是否将where 语句包含在可以传递名为SINGLETON 的值的父类中?这非常重要,否则 C# 类型检查器不会让你运行。
    • 是的,我注意到它可以让我访问成员变量,但不能访问静态类函数。例如。如果我添加 public int test = 1 它会找到 P.id。但是找不到P.SINGLETON静态调用。
    • 更正:我相信静态值不能被传递,但您可以轻松地从父级调用它,例如ID.SINGLETON
    • 宾果游戏VerifyIdExists(type, (P)ID.SINGLETON);
    猜你喜欢
    • 2019-07-01
    • 2022-07-05
    • 2012-05-06
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    相关资源
    最近更新 更多