关于C#反射

cjer 2008-08-01 11:19:24
Assembly t_AssemblyMethod = Assembly.Load(t_NameSpace); //加载程序集
Type t_MethodType = t_AssemblyMethod.GetType(t_TypeName);//获取对象
object t_MethodTypeObj = Activator.CreateInstance(t_MethodType,""); //创建实例

在创建实例是发现有一些方法没有对外的构造函数,无法创建实例,怎么办?
分不够可再加,谢谢!
...全文
173 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
kokyulei 2008-08-02
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 GhostAdai 的回复:]
一般这种类会提供一个方法用来返回该类的实例的,试试用反射获取该类型方法。
[/Quote]
我同意此观点.
mikko1986 2008-08-01
  • 打赏
  • 举报
回复
没有公共构造函数本来就是不允许直接实例化,即时是反射也不允许。

你可以用t_MethodType 获取一下这个类型的所有公共方法和属性对象,并检测其返回值类型是否等于MethodType,如果等于就用Type.InvokeMember方法调用那个返回等于MethodType类型参数的方法。

我也就知道这么多了……
jacklau88 2008-08-01
  • 打赏
  • 举报
回复
学习
rainxy2000 2008-08-01
  • 打赏
  • 举报
回复

Assembly t_AssemblyMethod = Assembly.Load(t_NameSpace); //加载程序集
Type t_MethodType = t_AssemblyMethod.GetType(t_TypeName);//获取对象
//得到无参的构造函数, 包括私有和公有的. 如果是有参的, 请修改第三个参数.
ConstructorInfo ctor = t_MethodType.GetConstructor(
BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance,
null,
new Type[0],
null
);
object o = ctor.Invoke(new object[]{}); //创建实例.
//TODO:再强制类型成你要的class.
//比如:TestClass theClass = (TestClass)o;
sunrobust 2008-08-01
  • 打赏
  • 举报
回复
你说的是被Private 修饰的构造函数吗?
tomiehu 2008-08-01
  • 打赏
  • 举报
回复
重写方法把构造函数加上行不行
GhostAdai 2008-08-01
  • 打赏
  • 举报
回复
一般这种类会提供一个方法用来返回该类的实例的,试试用反射获取该类型方法。
cjer 2008-08-01
  • 打赏
  • 举报
回复
这种方法也没办法实例化...

[Quote=引用 3 楼 rainxy2000 的回复:]
//TODO:再强制类型成你要的class.
//比如:TestClass theClass = (TestClass)o;
[/Quote]

因为是将原来的操作保存下来,待确认后执行,所以保存了
操作类的FullName,方法,参数(为对象序列化后的XML),参数类型

现在遇到某些方法
1、类不存在对公开的构造函数
2、调用了类里头的属性对象的方法来操作,而跟踪后发现该属性的类型是抽象类...
cjer 2008-08-01
  • 打赏
  • 举报
回复
//获取这个获取对象下的属性,然后用foreach找出所要的属性
PropertyInfo t_PropertyInfo = null;
PropertyInfo[] t_PropertyInfos = t_MethodType.GetProperties();

foreach (PropertyInfo t_p in t_PropertyInfos)
{
if (t_p.Name != p_MiStdLibMng_PreOpxml.OpClass.Substring(p_MiStdLibMng_PreOpxml.OpClass.LastIndexOf('.') + 1)) continue;
t_PropertyInfo = t_p;
break;
}

获取需处理的方法
MethodInfo[] t_MethodInfos = t_PropertyInfoType.GetMethods();
MethodInfo t_OPMethod = null;

foreach (MethodInfo t_minfo in t_MethodInfos)
{
//...查找所需要的方法
//得到该属性之后想获取该属性对象的方法及其操作
//[NameSpace].[ClassName].[PropertyName].[SubName]([Params]);
t_OPMethod = t_minfo ;
}
try
{
//处理
t_OPMethod.Invoke(new object()[此处object获取不到], t_objs);
...
}
catch ...

结果发现,该属性下的类型是一个抽象类~~~无法实例话...而t_OPMethod.Invoke也无法使用了
怎办

110,538

社区成员

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

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

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