首页 新闻 会员 周边

动态类型转换

0
悬赏园豆:50 [已解决问题] 解决于 2015-08-05 14:58
 如果函数返回的是基类,通过哪种方式可以转换成子类对象(子类对象名称是配置文件中配置的字符串)
 
例如:基类:Person,子类:Soldier:Person。
函数:
Public static  Person GetPerson()
{
    return new Soldier();
}
 
 Person p =GetPerson();
//根据配置文件得到的应该是“namespace.Soldier” 字符串。
///问题在这里???:在这里我想通过反射调用Soldier对象上的方法,(但是该方法在Person 类中是不存在的),只能转换成Soldier对象,然后Invoker
问题补充:

现在项目的接口返回的是基类对象,具体是创建子类也是项目的动态库封装在里面,只告诉可以在配置文件中取到具体的实例化的是那个子类。这是架构设计

TFS的主页 TFS | 初学一级 | 园豆:89
提问于:2015-07-08 09:46
< >
分享
最佳答案
0

这就扯淡了,你要调用的方法不在基类上,又要用基类引用调用,,这种情况你直接用子类引用获取子类对象不就好了.

1.用基类引用无法调用不存在的字段,

2.想要调用,你可以先用is判断该对象是不是子类对象,然后强转为子类引用.

3.使用反射调用    你的对象是子类对象,只是使用基类引用指向而已,并不是子类对象,所以你可以从里面反射出子类成员 多说一句,你这样做完全是错误的,你不应该这样做

还有什么问题吗?

 

收获园豆:39
吴瑞祥 | 高人七级 |园豆:29449 | 2015-07-08 10:14

所以我想要把基类转换成对应的子类,如使用as 。 但是我不想使用if 判断去使用as这样转换。

TFS | 园豆:89 (初学一级) | 2015-07-08 10:24

可以使用反射得到子类的成员,这没有问题,问题是我这样动态的把基类转换成子类对象

TFS | 园豆:89 (初学一级) | 2015-07-08 10:25

@TFS:

1.不判断的话你凭什么认为里面返回的是子类对象,从定义上来看你只能保证他返回一个基类对象.

2.对象是不能转换的,转换的引用.这个是基本概念问题,内存里的对象并不会真的被强转的,只是使用不同的引用指向这个对象而已.而且动态转换成子类对象,哪来的动态,子类是无数的,这种情况你怎么判断他是哪个子类?

还有什么问题?

完全违反设计原则的事情的就不要纠结啦....对象不是这样面向的,抽象不是这样抽象的,子类不是这样定义,工厂方法不是这样用的.

吴瑞祥 | 园豆:29449 (高人七级) | 2015-07-08 11:08
其他回答(3)
0

不知道你这样做的目的是什么,如果目的是要调用子类的方法,可以在基类声明virtual方法,在子类override,这样要调用这个子类的方法只需要用基类的引用就可以执行到子类override的方法的代码了。

收获园豆:5
liqipeng | 园豆:1160 (小虾三级) | 2015-07-08 10:12
0

你得先把p转换成Soldier Soldier s=(Soldier)p;

然后在Invoker, 你Person里面没有Soldier的方法  你p肯定是没法调用的,

这里如果要通用可以写一个扩展<T>

收获园豆:5
jio92 | 园豆:1064 (小虾三级) | 2015-07-08 10:13
0

没看明白你想怎么做,针对下面的代码:

Public static  Person GetPerson()
{
    return new Soldier();
}
 
如果这样调用:
Person p = GetPerson();
 
在这里我想通过反射调用Soldier对象上的方法” ,假设 Soldier 上有个方法叫着 GetWeapon,而 Person 上没有(“但是该方法在Person 类中是不存在的”),那么下面的调用仍然成立:
var getWeaponMethodInfo = p.GetType().GetMethod("GetWeapon");
var weapon = getWeaponMethodInfo.Invoke(p,new object[]{});
 
只能转换成Soldier对象,然后Invoker” ——〉 你仔细看,我没有转换成 Soldier 对象,但是也能 Invoke!
 
那么问题了来了,你究竟想表达什么意思
你是不是连代码都没写过,就在脑子里根据自己错误的基础知识设计了个“思想实验”觉得不可行后就来提问了?
 
收获园豆:1
Launcher | 园豆:45045 (高人七级) | 2015-07-08 11:44
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册