我们有一个场景,我们需要按名称(字符串)创建一个类型。我们使用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
中调用另一个采用泛型类型参数的方法,因此不确定如何使用类型来解决它
答案 0 :(得分:2)
变量derived
实际上是Derived
类型。问题在于采用编译时类型的泛型方法。为了使您的工作成为可能,您可以将其强制转换为dynamic
以强制使用运行时类型。
ShowType((dynamic)derived);
P.S。在这种情况下,您应该考虑与dynamic
相关的性能问题。
答案 1 :(得分:2)
这是因为derived
变量声明为Base
类型,而ShowType()
方法正在使用T
(Base
),而不是obj
对象ShowType()
。
void ShowType<T>(T obj)
{
obj.GetType().FullName.Dump();
}
应该是这样的:
{{1}}