请大家讨论:如何根据从数据库读取的值决定调用类的哪一个方法?

qz4365 2003-03-31 11:27:33
想实现一个这样的功能,请大家讨论该如何实现:
根据从数据库读取的结果,决定调用类中的哪一个方法.
原来的需求是这样的:在数据库的表中,其中的某列的值是根据其他列的值经过比较复杂的计算得出来的,而且可能有多个不同的方法来计算,这些方法已事先做到某个类中,并且其名称,返回值类型,参数等信息均已保存在数据库中.希望能做到让用户自已选择所用的方法.

举例说明如下:
有数据库表Table1如下:

列1 列2 列3 列4
5 8 2 X
3 7 9 X
6 3 1 X
...

其中列4的值是我们要求的结果.根据其他列的值通过一定计算得出的.而这种计算的方法有3种,用户可以根据需要选择.
方法一:列4 = 列3 + 列2 * 列1
方法二:如果列1的值大于5,列4=列2+列3.否则列4=列2-列3
方法三:如果列1*列2是偶数,则列4=列1,否则列4=列2

现在这三个计算方法都已做为类的方法写到类的代码中,数据库中也保存了每个方法的返回值,参数,参数与列的对应表,但使用哪个方法是由用户决定的.
我原来考虑用委托来实现,但各个方法的返回值与参数类型均不相同,比较难实现.请大家讨论有什么比较好的办法.

...全文
32 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
qz4365 2003-04-01
  • 打赏
  • 举报
回复
谢谢诸位的讨论.结贴
qz4365 2003-04-01
  • 打赏
  • 举报
回复
To Timmy3310:
"完全可以用良好的设计与接口的使用来达到"
可以详细说说你的思路吗?
bbwolf 2003-03-31
  • 打赏
  • 举报
回复
我说的方法就是按照名称调用。
根据数据库的内容,直接调用数据库所取到的String对应的类和方法。
unfor 2003-03-31
  • 打赏
  • 举报
回复
参考
ms-help://MS.VSCC/MS.MSDNVS.2052/cpref/html/frlrfSystemDataDataColumnClassExpressionTopic.htm
bbwolf 2003-03-31
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/1388/1388540.xml?temp=.8705561
参考一下看看
qz4365 2003-03-31
  • 打赏
  • 举报
回复
回龙人:
由于实际的方法会比较复杂,因此无法通过新建一个表达式列实现
dragontt 2003-03-31
  • 打赏
  • 举报
回复
可以新建一个列
然后
设定Expression属性来操作

参考
ms-help://MS.VSCC/MS.MSDNVS.2052/cpref/html/frlrfSystemDataDataColumnClassExpressionTopic.htm
timmy3310 2003-03-31
  • 打赏
  • 举报
回复
使用反射来调用不同的方法

请参考:
ms-help://MS.VSCC/MS.MSDNVS.2052/cpref/html/frlrfsystemtypeclassinvokemembertopic3.htm
dragontt 2003-03-31
  • 打赏
  • 举报
回复
同意timmy的观点
把方法名称和参数列表维护在数据库始终不是很好的解决方案
是一种很奇怪的设计方式
感觉有点像给自己找麻烦
会出现很多新问题

不过,还是祝你好运吧
timmy3310 2003-03-31
  • 打赏
  • 举报
回复
"是当方法被封装,而从另一个DLL中调用的话,就不必每增加一个新方法,重新编译调用的模块了."

这种功能完全可以用良好的设计与接口的使用来达到
我觉得把方法名称和参数列表维护在数据库始终不是很好的解决方案
qz4365 2003-03-31
  • 打赏
  • 举报
回复
To:timmy3310(tim)

当然,如果方法比较少而且固定的话,用switch...case完全可以满足要求,但是当方法被封装,而从另一个DLL中调用的话,就不必每增加一个新方法,重新编译调用的模块了.
bbwolf 2003-03-31
  • 打赏
  • 举报
回复
如果你需要让用户自己选择方法,就一定要有个存储方法的地方。
你只需要把方法名称记录于数据库,再按照我说的那种方法就可以了。

Type CallType = Type.GetTypeFromProgID("YouClass");
if(CallType!=null)
{
object CallObj = Activator.CreateInstance(CallType);
System.Reflection.MethodInfo CallIt = CallType.GetMethod("YouMethodFromDataBase");
if(CallIt!=null)
{
Object[] CallParam;
FillCallParam(CallParam)//从数据库取参数
object rt = CallIt.Invoke(CallObj,CallParam);
}
}

这样的话你的方法也是从数据库取出,Class也是取出。
timmy3310 2003-03-31
  • 打赏
  • 举报
回复
如果选择不多而且不会变化的话,那么用Switch Case不就可以了吗?大不了多几个if也可以啊,干嘛要弄这么复杂
qz4365 2003-03-31
  • 打赏
  • 举报
回复
关于反射的内容不是很了解,正在学习中.
欢迎大家继续讨论.明天结贴
timmy3310 2003-03-31
  • 打赏
  • 举报
回复
使用反射可以做到
例如类MyClass有A、B、C三个方法,那么:

MyClass obj = new MyClass();

Type t = obj.GetType();

object[] parameters = new object[]{};// 调用方法传的参数

string methodName = "A"; //方法名称

object returnValue = t.InvokeMember (methodName, BindingFlags.Public | BindingFlags.InvokeMethod, null, obj, parameters );

更详细内容,请参考:

ms-help://MS.VSCC/MS.MSDNVS.2052/cpref/html/frlrfSystemTypeClassInvokeMemberTopic.htm
qz4365 2003-03-31
  • 打赏
  • 举报
回复
To:大坏狼

我想你说的方法并不适合这个问题.因为这是关于调用类的方法,类名是已知的.并不是根据名称生成类的实例的问题.谢谢你的回复
wljcan 2003-03-31
  • 打赏
  • 举报
回复
这个问题可以使用工厂方法模式来解决,参考《设计模式》

即:一个方法可能有多种实现。

62,041

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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