我使用Unity。我有一个
abstract class A {}
class A1 : A {object someField;}
class A2 : A {object someField;}
我有一个CustomEditor,可在其中创建带有反射的A1 / A2实例(我需要能够添加从A派生的新类) 但是有一个问题:如果我像
这样使用Activator,Type chosenType = ChooseType(); //ChosenType can be A1 or A2
A newObj = (A)Activator.CreateInstance(chosenType)
Unity不会序列化该对象(因为它将对象序列化为(A)而不是(A1)或(A2)) 我想像
(chosenType)MyObj
答案 0 :(得分:1)
我看到的动态进行类型转换的最好方法是创建一个通用的
public static class ReflectionHelper{
public T CastTo<T>(object obj)
{
return (T) obj;
}
}
然后在运行时创建一个通用方法以强制转换为我的特定类型。
var value = Activator.CreateInstance(ChosenType());
typeof(ReflectionHelper)
.GetMethod("CastTo")
.MakeGenericMethod(new []{value.GetType()})
.Invoke(null, value);
在调用中,我们将null称为因为它是一个静态方法,如果它是一个实例方法,则需要一个Reflection Helper类型的对象的实例。
但是,我想警告您,做这些事情往往会产生代码味道,我敦促您仅将反射作为最后的选择,而不是将其作为第一个尝试