如何通过名称激活派生类型?

时间:2016-02-17 19:45:49

标签: c# .net generics types

我们有一个场景,我们需要按名称(字符串)创建一个类型。我们使用activator,但因为在编译时类型是未知的,所以我们将它分配给已知的基类型。但我们实际需要的是对象的行为与它的真实类型相同。见例:

void Main() {
    // Scenario A
    ShowType(new Derived());

    // Scenario B
    var derivedType = Type.GetType("Derived");
    var derived = Activator.CreateInstance(derivedType) as Base;
    ShowType(derived);
}

void ShowType<T>(T obj) {
    typeof(T).FullName.Dump();
    RaiseEvent(new Event<T>());
}

void RaiseEvent(Event<T> obj) {
}

public class Base {}
public class Derived : Base { }

返回的内容如下:

Scenario A: Derived (good)
Scenario B: Base (bad)

如何让方案B充当方案A? (即,使ShowType实际上获取Derived对象)

调用obj.GetType()确实给出了我们想要的类型,但在实际情况下我们在ShowType中调用另一个采用泛型类型参数的方法,因此不确定如何使用类型来解决它

2 个答案:

答案 0 :(得分:2)

变量derived实际上是Derived类型。问题在于采用编译时类型的泛型方法。为了使您的工作成为可能,您可以将其强制转换为dynamic以强制使用运行时类型。

ShowType((dynamic)derived);

P.S。在这种情况下,您应该考虑与dynamic相关的性能问题。

答案 1 :(得分:2)

这是因为derived变量声明为Base类型,而ShowType()方法正在使用TBase),而不是obj对象ShowType()

void ShowType<T>(T obj) { obj.GetType().FullName.Dump(); } 应该是这样的:

{{1}}