传递通用(模板)Class 用于运行时初始化
Pass A Generic (Template) Class For Runtime Initialization
现在我有一个数据库,它初始化了一大堆卡片类型,如下所示:
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 class
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);
}
尝试这样的事情:
private void LoadCardTypes<T>() where T : ParentClass
{
//other code
T type = (T)asset;
//other code
VerifyIdExists(type, T.SINGLETON);
}
ParentClass
是您保证通过的任何类型 T
都是 inherited/implemented 的类型。它应该将 SINGLETON
值作为其值之一,以便您能够使用它。
现在我有一个数据库,它初始化了一大堆卡片类型,如下所示:
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 class
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);
}
尝试这样的事情:
private void LoadCardTypes<T>() where T : ParentClass
{
//other code
T type = (T)asset;
//other code
VerifyIdExists(type, T.SINGLETON);
}
ParentClass
是您保证通过的任何类型 T
都是 inherited/implemented 的类型。它应该将 SINGLETON
值作为其值之一,以便您能够使用它。