如何动态投射对象?
我很确定之前有人问过,但不幸的是,我发现的唯一一件事就是这对我来说不是解决方案。 在我目前的项目中,我做了类似的事情:
private object obj; private void Initialize() { obj.Initialize(); } private void CreateInstanceA() { obj = Activator.CreateInstance(typeof(MyClassA)); } private void CreateInstanceB() { obj = Activator.CreateInstance(typeof(MyClassB)); }
这个代码当然不起作用,因为我没有强制转换obj
因为它的类型动态变化。
我该如何动态投射?
三种选择:
- 如果您控制这两个类,并且可以让它们实现包含您需要的所有内容的通用接口,那么就这样做 – 并转换为接口
- 如果您使用的是C#4和.NET 4,则可以使用动态类型 – 只需将变量声明为
private dynamic obj;
它将在执行时编译并找到正确的方法 - 否则,使用reflection来查找并调用该方法。
基本上基于执行时间类型的转换没有意义,因为转换点的一部分是为编译器提供更多信息……在这种情况下你根本就没有。
如果您可以实现它,那么第一个选项是迄今为止最好的选择。
我假设CreatInstanceB()实际上应该使用MyClassB,对吗?
在这种情况下,您可以使用:
((MyClassA)obj).Initialize();
…
((MyClassB)obj).Initialize();
或者您可以创建一个具有Initialize方法的接口,并将obj定义为该接口。