【发布时间】:2021-08-30 22:53:46
【问题描述】:
我正在开发 Unity C# 并尝试制作我自己的可序列化字典以与 ScriptableObject 一起使用。我正在使用通用方法和通用索引类来做到这一点。我有一个Add 函数,它接收Key 和Value,两者都是任何数据类型,与C#Dictionary 非常相似。我还创建了自己的 KeyValuePair 类来配合它。
但是,每当我将列表作为值传递时,它当然会作为参考接收。但我只想接收一些基于引用的类型和数据类型作为值。在非泛型方法中,我可以在收到它后立即从中创建一个新列表,但显然我不能使用泛型方法来做到这一点。
public bool Add(in S Key, in T Value)
{
// Apparently I can't do this here:
// T ReceivedValue = new T(Value);
for (int i = 0; i < KeyValuePairs.Count; i++)
{
if (KeyValuePairs[i].Key.Equals(Key))
{
Debug.LogError("Key '" + Key + "' already exists in the AMADictionary.");
return false;
}
}
KeyValuePairs.Add(new AMAKeyValuePair<S, T>(Key, Value));
return true;
}
为了实现这一点,我总是必须在括号中执行这个过程,同时调用 Add 方法,这很慢,而且总是要记住一件额外的事情。有没有办法在方法中实现这一点?
谢谢大家!
【问题讨论】:
-
我很抱歉,但我不是要求解决问题。相反,我自己需要代码或方向来了解如何实现上述可能性。我正在寻找的是上面提供的代码中注释部分的工作代码。
-
我认为您可以在How to determine whether T is a value type or reference class in generic?、How do I clone a generic list in C#?、Clone a generic type 和类似问题之间找到答案。顺便说一句,如果
S和T都是可序列化的,那么无论如何这将是可序列化的,对吧?
标签: c# unity3d generic-method