从类型变量转换为类型

时间:2019-02-20 16:30:20

标签: c# unity3d

我使用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

1 个答案:

答案 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类型的对象的实例。

但是,我想警告您,做这些事情往往会产生代码味道,我敦促您仅将反射作为最后的选择,而不是将其作为第一个尝试