c# 反射问题请教。能动态生成类名吗?

song403 2016-01-22 11:05:50
我在一个项目中尝试使用反射来实现这样的功能。假设我有一个dll,代码如下:

namespace Avatar
{ public Class A
public bool Function A1()
{}
public bool Function A2()
{}
}

另外一个dll, 代码如下:
namespace Avatar
{ public Class B
public bool Function B1()
{}
public bool Function B2()
{}
}

在我的主程序中我使用了一个函数来动态调用这两个dll
public bool InvokeFunction(cstring className, functionName)
{
Assembly ass = Assembly.loadfile(dll地址);
Type t = Type.GetType(className);
object dObj = Activator.CreateInstance(t);
MethodInfo method = t.GetMethod(functionName);
bool returnValue =(bool) method.Invoke(dObj,flag,Type.DefaultBinder,parameters,null);
}
假设我的程序要调用A1,A2,B1,B2各一次,程序4次调用Invoke函数。这样在内存中就会有4个A,B类实例。速度很慢。有没有办法在程序中只生成一次A,B实例各一次。问题是我的程序里有许多类A.B.C,D,E,F.....只有在程序运行时才知道要反射那个类。不能首先显式的直接生成所有的类实例。我想将要反射的类名放在外部的一个xml里。通过读取它来决定生成那些类实例。但是关键是
object dObj = Activator.CreateInstance(t);
MethodInfo method = t.GetMethod(functionName);
中的dObj, method不能动态命名。比如我 cstring typeName = xmlDoc.selectnode.innertext; 这时typeName = “A" 我不能将变量typename直接作为类实例的名字 object typeName = Activator.CreateInstance(t) 来创建A的类实例。
请哪位大侠指点一二,谢谢!
...全文
210 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
song403 2016-01-25
  • 打赏
  • 举报
回复
是的。回去思考了一下,可能我自己想实现的功能太复杂了。完全想平台与测试实现方法分离。搞得太复杂。还是先实现功能再说吧。
  • 打赏
  • 举报
回复
你可以用字典贮存你反射出来的实例,当然如果反射出来的只是model这种类因为引用类型问题就不一定适合持久在字典中了
threenewbee 2016-01-22
  • 打赏
  • 举报
回复
可以用codedom动态编译,也可以用emit。
Poopaye 2016-01-22
  • 打赏
  • 举报
回复
Dictionary<string, object> 你连这样的数据结构都不知道使用,还是研究反射的问题了
  • 打赏
  • 举报
回复
代码少了一个声明,应该改为
IAvatar instance =  (IAvatar)Activator.CreateInstance(t);
var result1 = instance.ImageUrl;
var result2 = instance.IsMyFriend();
真正懂得反射的人,并不滥用反射。反倒是一些不成熟的人,胡乱地过度理解什么“控制反转”概念,胡乱反射。 你可以看到,在编译期就按照 IAvatar 接口去编排后续的代码、进行类型检验和代码生成了。读取 ImageUrl 属性和调用 IsMuFriend 用神马反射呢? 从头脑发热地过度反射,你能看出一些糟糕的习惯。
  • 打赏
  • 举报
回复
滥用反射,没有好处。 正规的工厂方法是这样写的
IAvatar instance =  Activator.CreateInstance(t);
var result1 = instance.ImageUrl;
var result2 = instance.IsMyFriend();
也就是说,人家是因为有了“面向接口编程抽象”这种大战略,才有了工厂方法。 而那些滥用反射的过头做法,写不了多少代码就难以调试、难以扩展、难以保证基本的质量了。这种方式貌似挺时髦挺技术化,其实坑人。
  • 打赏
  • 举报
回复
引用 楼主 song403 的回复:
比如我 cstring typeName = xmlDoc.selectnode.innertext; 这时typeName = “A" 我不能将变量typename直接作为类实例的名字 object typeName = Activator.CreateInstance(t) 来创建A的类实例。 请哪位大侠指点一二,谢谢!
那你考虑反射干神么啊?你直接先研发一个可以编程序的程序呗。你要做的事情是用程序来编写程序,同时还要一点都不损失性能,而不是写具体的代码。
song403 2016-01-22
  • 打赏
  • 举报
回复
另外在上面的Invoke函数中,能否在获得method的bool返回值后将method,assebly,type这些资源释放掉。这样就不会再内存中同一时刻存在对个相同的类实例了。 求助,求助!!!!!!!!

110,533

社区成员

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

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

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