在线等!!!C# 有基类对象,如何知道是那个派生类的。

e472413641 2014-10-23 03:13:01
问题是在code first里面,用继承的映射关系,TPT,基类是Form ,派生类有Form_Leave和其它类,现在有一个方法从数据库读取到一个Form对象,每一条Form的数据都有是一个派生类和它对应的,现在我把Form读取出来了,并且我调试的时候发现里面有Form_Leave的信息,我想把他转成Form_Leave,这个用(Form_Leave)就可以转,但是在程序里面,如何知道Form是Form_Leave还是Foem_Reimburse?在线等!!!
...全文
401 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
HZXI00 2015-12-09
  • 打赏
  • 举报
回复
路过,看看,享元模式?
e472413641 2014-10-24
  • 打赏
  • 举报
回复
引用 9 楼 sp1234 的回复:
在你的流程设计中,你不知道你原本是要查询什么类型的对象,你为什么要调用 FormService.GetForm 进行查询呢? 想做“工具类”平台?你现在肯定做不了那种设计。 所以你现在首先要定好一个规矩:写这个“方法”代码之前,先想好你这个方法的职责到底有没有搞清楚,再设计程序流程。不要“先查询,然后再想查询要干什么”。
你说的内容我有点难消化,我是想这样的 Form是申请,有很多种申请,所有就搞派生类 系统里面每一个申请都单独做肯定会很大工作量,所以某些部分我做成通用的,例如审核页面。 做审核页面的时候就传一个FormID进来,我就要处理了,要判断是哪一种申请,然后加载不同的分部视图,因为毕竟部分字段是不同的。这个code first的继承我刚用,Form是基类表,Form_Leave是派生类表,他们在数据库中 字段是要加到一起才能形成完整意义上的Form_Leave,就是Form_Leave有5个字段,Form表有两个,Form_Leave有3个。 这个 系统我自己做,做的很郁闷,所有就想到怎样做就怎样做,没办法啊,我是新手。
相思梦 2014-10-23
  • 打赏
  • 举报
回复
反射(reflection)
  • 打赏
  • 举报
回复
如果是你自己实现的应该改成泛型的 如果是别人提供的,那就用 var myForm = frm as MyForm; if(myForm != null) { 就是MyForm类型的 }
  • 打赏
  • 举报
回复
在你的流程设计中,你不知道你原本是要查询什么类型的对象,你为什么要调用 FormService.GetForm 进行查询呢? 想做“工具类”平台?你现在肯定做不了那种设计。 所以你现在首先要定好一个规矩:写这个“方法”代码之前,先想好你这个方法的职责到底有没有搞清楚,再设计程序流程。不要“先查询,然后再想查询要干什么”。
  • 打赏
  • 举报
回复
引用 6 楼 e472413641 的回复:
[quote=引用 4 楼 sunny906 的回复:] 转到GetForm(id)的方法里应该就能知道具体是哪个类了
这个不行,GetForm根据传入不同的id会返回不同的Form,这个Form可能会带有它派生类的信息[/quote] 就算是数据库通用方法
public object GetObjectById(string id)
的方法呢,但是调用它的程序还是得写
var obj = (MyObjType)GetObjectById("123456akdfak");
  • 打赏
  • 举报
回复
引用 楼主 e472413641 的回复:
问题是在code first里面,用继承的映射关系,TPT,基类是Form ,派生类有Form_Leave和其它类,现在有一个方法从数据库读取到一个Form对象,每一条Form的数据都有是一个派生类和它对应的,现在我把Form读取出来了,并且我调试的时候发现里面有Form_Leave的信息,我想把他转成Form_Leave,这个用(Form_Leave)就可以转,但是在程序里面,如何知道Form是Form_Leave还是Foem_Reimburse?
你的这个流程设计,违背了面向对象的基本的设计原则。 你得“方法”在读取了数据对象之后要进行处理,你这个方法到底是定义在Form还是针对Form_Leave还是针对Form_Reimburse类型上的方法? 如果说你的一个方法是针对Form类型对象进行处理的,那么这个方法处理流程就应该是处理所有的Form都有的操作,不区分其子类型。 如果说这个方法是专门针对Form_Leave的,那么就应该写
Form_Leave form =(Form_Leave)GetForm(id);
或者更好地是写
Form_Leave form =(Form_Leave)GetForm_Leave(id);
不要滥用什么“工厂方法”。如果你把工厂方法给反过来滥用了,就成了搅乱了。
e472413641 2014-10-23
  • 打赏
  • 举报
回复
引用 4 楼 sunny906 的回复:
转到GetForm(id)的方法里应该就能知道具体是哪个类了
这个不行,GetForm根据传入不同的id会返回不同的Form,这个Form可能会带有它派生类的信息
e472413641 2014-10-23
  • 打赏
  • 举报
回复
引用 1 楼 u014305652 的回复:
form.gettype() == typeof(Form_Leave)
gettype() 好像有用,我先试试
sunny906 2014-10-23
  • 打赏
  • 举报
回复
转到GetForm(id)的方法里应该就能知道具体是哪个类了
勒特一体狗 2014-10-23
  • 打赏
  • 举报
回复
C# 有个 is操作符
勒特一体狗 2014-10-23
  • 打赏
  • 举报
回复
或在虚函数里处理
勒特一体狗 2014-10-23
  • 打赏
  • 举报
回复
form.gettype() == typeof(Form_Leave)

111,092

社区成员

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

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

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