有一个子类对象但是基类声明,可否通过反射机制把他直接转化成子类声明

卑鄙的我 2014-08-04 01:36:23
c#的反射机制可否实现这样的功能, 有一个子类对象但是基类声明,把他直接转化成子类声明
...全文
362 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 26 楼 sj178220709 的回复:
这已经违反了oo的原则了 子类可以替换父类,而不是父类替换子类. 如果你有个特性,是所有子类都有的, 那么你应该考虑使用继承或者接口,而不是反射, 反射是好东西,但应该能不用就不用.
如果是有些子类有,有些没有, 那么果断使用接口, 然后你传递这个接口的实例就ok.
  • 打赏
  • 举报
回复
这已经违反了oo的原则了 子类可以替换父类,而不是父类替换子类. 如果你有个特性,是所有子类都有的, 那么你应该考虑使用继承或者接口,而不是反射, 反射是好东西,但应该能不用就不用.
Saleayas 2014-08-05
  • 打赏
  • 举报
回复
她本身就是。
卑鄙的我 2014-08-05
  • 打赏
  • 举报
回复
引用 23 楼 Saleayas 的回复:
object.GetType();
然后怎么转成对应类型
Saleayas 2014-08-05
  • 打赏
  • 举报
回复
object.GetType();
卑鄙的我 2014-08-05
  • 打赏
  • 举报
回复
引用 21 楼 Z65443344 的回复:
所谓反射,是通过对象名称来找对象,首先你就要知道对象名称 比如你有a和b 现在传入一个字符串"a",通过这个字符串去找到a,并调用 如果连这个都不知道,那就根本和反射不沾边. 你现在是有个object类型的变量,但是不知道类型,你想先匹配出类型,再实例化?
对,我想在仅仅只有一个object对象没有任何其他信息的情况下匹配出类型, 有没有可能 ?
於黾 2014-08-05
  • 打赏
  • 举报
回复
所谓反射,是通过对象名称来找对象,首先你就要知道对象名称 比如你有a和b 现在传入一个字符串"a",通过这个字符串去找到a,并调用 如果连这个都不知道,那就根本和反射不沾边. 你现在是有个object类型的变量,但是不知道类型,你想先匹配出类型,再实例化?
  • 打赏
  • 举报
回复
首先一点,如果有一些独有功能必须要子类才能实现的话,理论上讲就不应该再来传递父类,因为这样做不合理,就像上面说的,你可以考虑泛型,泛型可不管你这个指定的类是父类还是子类 另外如果你真的一定要知道如何转化成特定子类的话,你这个明显只可能硬编码、或者走配置,而这么做的前提条件是,你的基类定义中一定要有一个公开的属性或者方法甚至字段能够明确的指示外部这个类实际上究竟是哪个类
卑鄙的我 2014-08-05
  • 打赏
  • 举报
回复
引用 18 楼 effun 的回复:
又仔细看了一遍楼主的提问,发现“独有”这个词,我想是不是这个意思。

class Base
{
}
class A : Base
{
  public int P1 { get; set; }
}

class B: Base
{
  public int P2 { get; set; }
}

class Program
{
  public int SomeMethod(Base obj)
  {
    if (obj is A) return ((A)obj).P1;
    else if (obj is B) return ((B)obj).P2;
    else
       throw new NotImplementedException("你很蛋疼");
  }
}
楼主你确定这是你想要的吗?
不是的 是我前面没描述清楚, 我想要的是, 我当前只有一个object, 不知道其基类,也不知道子类。 可否通过Type类转换为子类结果 var res = (obj.GetType())object; 此语句仅描述意思
effun 2014-08-05
  • 打赏
  • 举报
回复
又仔细看了一遍楼主的提问,发现“独有”这个词,我想是不是这个意思。

class Base
{
}
class A : Base
{
  public int P1 { get; set; }
}

class B: Base
{
  public int P2 { get; set; }
}

class Program
{
  public int SomeMethod(Base obj)
  {
    if (obj is A) return ((A)obj).P1;
    else if (obj is B) return ((B)obj).P2;
    else
       throw new NotImplementedException("你很蛋疼");
  }
}
楼主你确定这是你想要的吗?
卑鄙的我 2014-08-05
  • 打赏
  • 举报
回复
你们说的对,当然有很多设计可以解决需求, 此处的提问只是作为探讨出现,并非为解决问题。 期待高招出现
卑鄙的我 2014-08-05
  • 打赏
  • 举报
回复
显式的类型转换是在编译时处理的,在编译时可能根本不知道某个变量真正的类型是什么,具体的类型只有在运行的时候,通过语句一条一条执行才能知道变量的实际类型,GetType()或反射就是在运行时处理的,试想一下这样两种方式怎么硬把它们合到一起去呢 了解了, 多谢
effun 2014-08-05
  • 打赏
  • 举报
回复
var res = (obj.GetType())object?????? 这显然不符合语法要求,根本不能编译,即使是理解也是不对的。 显式的类型转换是在编译时处理的,在编译时可能根本不知道某个变量真正的类型是什么,具体的类型只有在运行的时候,通过语句一条一条执行才能知道变量的实际类型,GetType()或反射就是在运行时处理的,试想一下这样两种方式怎么硬把它们合到一起去呢? 有几种办法来解决这个问题: 1、有共同基类,可通过基类的虚方法(属性)来访问子类的成员,接口也可以。 2、如果没有共同基类,但在写代码的时候知道某个方法或属性的名称,并且你用的是.net 4.0或更高版本,可以用dynamic关键字。 3、如果只是想调用一个方法,并且这个方法在所有类型里的声明都一样,可以用委托。 4、如果没有任何共同点,可以用一个配置文件来说明哪个类型调用哪个方法,然后用反射来调用。 如果以上情况都不满足你的要求,要么改动原来的程序来满足,要么你就改行吧。
游离失所 2014-08-04
  • 打赏
  • 举报
回复
我需要得到a temp = (a)base; b类需要得到 b temp = (b)base; 结合你上面所叙述的内容。。你想要的是 var temp = 方法 base base如果是a类型,var temp 就是 a类型。。 你这样的思路是错的,哪怕用反射,它出来的也是个object类型。。你也要强制转换成base或a,b类型。。 你需要的是泛型。。。你好好去理解下吧。。 不然你可以把设计和思路都放上来,让大家看看。。我可以很肯定的是你的思路是绝对错误的
游离失所 2014-08-04
  • 打赏
  • 举报
回复
不知道这样做的意义何在。。为何不使用泛型
伤痕累累 2014-08-04
  • 打赏
  • 举报
回复
就算你知道它的类型并转换成功了,你打算怎么做呢? if( t is A) t.aa="XX"; else if(t is B) t.bb="XXX"; ........ 还是用泛型吧骚年
  • 打赏
  • 举报
回复
你这样的高耦合是绝对需要在设计上去解决的
  • 打赏
  • 举报
回复
如果泛型和继承(包括接口)都解决不了你的问题 只能说明你的设计有问题
effun 2014-08-04
  • 打赏
  • 举报
回复
既然不知道子类的类型,怎么声明变量类型呢?你不可能穷尽所有子类的类型吧。实在不明白楼主你想要干什么,如果是要子类实现某个功能,可以在base里定义一个虚方法,然后在a和b里实现,这样只要从base里调用这个方法就可以了,管他是a还是b呢。
卑鄙的我 2014-08-04
  • 打赏
  • 举报
回复
问题是这样, 现在获取到一个对象,只知道其基类声明,不确定子类型到底是什么, 我需要把它转换成子类的声明,以便于获取子类中的独有数据。 class a : base ; class b : base ; 现在有声明为base的某个其子类对象, 如果是a类,我需要得到a temp = (a)base; b类需要得到 b temp = (b)base; 当然,我可以通过直接判断其对象类型来显式的做转换。 我想了解的是在不显式的指定其子类型做转换的前提下, 有没有什么办法。 Type类能不能帮上忙 ?
加载更多回复(9)

110,552

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧