您的位置:首页 > 编程语言 > C#

C# 利用反射创建类型实例的时候报错 MissingMethodException

2016-08-25 00:00 369 查看
摘要: C# 利用反射创建类型实例的时候报错 MissingMethodException 无法创建抽象类。

正常报出 MissingMethodException,是因为”No matching public constructor was found“,这是官方解释

也就是去检查一下是不是有无参构造函数,因为利用反射创建实例,就是调用无参构造函数。

如果不是构造函数的原因,那再来看看第二个错误信息:无法创建抽象类。

抽象类肯定是无法创建实例的,自然不比多说。

可是,what?我创建的类不是抽象类啊,为什么会这样提示?

经过我各种百度各种谷歌各种必应,大致猜测其原因是:该类中有用到动态绑定机制或者后期绑定机制,所以在编译阶段无法”完全编译“(不知道这个描述对不对)该类型,然后就造成这个类是个抽象类?(我也不太确定,没找到相关信息)

我的情况是在类中有用到动态类型 dynamic,然后用反射创建不了其实例,报出了 MissingMethodException 无法创建抽象类 的错误。

解决方案:把需要进行反射的类型里面的动态类型用 Dictionary<string, object> 代替,然后把 Dictionary 复制给动态类型,利用动态类型来访问其中的数据。

public class Test{
public Dictionary<string, object> TestMethod(){
// 我本来想这样写的,因为写起来方便
// dynamic data = new ExpandoObject();
// data.Test = "test";
// 然后只好改成这样了
Dictionary<string, object> data = new Dictionary<string, object>();
data["Test"] = "test";
}

public static void main(string[] args){
dynamic data = new Test.TestMethod();
// do sth.
// 将 Dictionary 复制给动态类型的好处就是不需要自己去进行类型转换
// 假设 Dictionary 里面存了一个 List,关键字为 test2
// 从动态类型中获取出数据后,可以直接调用 List 的方法
// 而从 Dictionary 中获取出来的数据,需要类型转换
// 即 data["test2"].Add("sth.");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C# 动态类型 反射