none
反射,实例无默认构造函数问题 RRS feed

  • 问题

  •   获取一个程序集,遍历里面的类那些实现了指定的接口,然后Todo,问题是,这里面的类有抽象类,和无参数和类,所以我在实例时,要判断,
                判断抽象类就用t.IsAbstract,判断是否有构造函数ConstructorInfo 然后判断lentgh是否大于0,如果这个类有一个带参数的构造函数,而没有无参数的,
                Activator.CreateInstance(t);会报错误,用CreateInstance重载 public static Object CreateInstance(
    Type type,
    bool nonPublic
    ) ,还是不行

     

    string resultFile=@"D:\msdn.dll"

     object obj;
                Assembly assembly = Assembly.LoadFile(resultFile);
                Type[] types = assembly.GetTypes();
                foreach (Type t in types)
                {
                    if (!t.IsAbstract)
                    {
                        ConstructorInfo[] ci = t.GetConstructors();
                        if (ci.Length > 0)
                        {
                            obj = Activator.CreateInstance(t);
                            if (obj.GetType().GetInterface("接口") != null)
                            {
                                MessageBox.Show(t.Name);
                            }
                        }
                    }
                }


    啥叫乐观-得瑟的最高境界
    2011年1月18日 11:48

答案

  • 您好,Activator.CreateInstance(Type type)方法只能构建有默认构造函数的类实例。除非调用CreateInstance(Type, Object[]) 方法,Object[]为构造函数的参数。

    这个方法是与指定参数匹配程度最高的构造函数创建指定类型的实例,所以你可以尝试欺骗,随意建一个对象数组然后用CreateInstance(Type, Object[])。我没试过,估计不一定成功。

    还有一个方法麻烦一些,您通过ci.GetParameters(),以获取参数的类型信息,然后构建一个对象数组。再调用CreateInstance(Type, Object[])方法,或ci.Invoke的方法。

    总之,需要想办法给无默认构造函数的类建一个参数。

    其实,从语义上来讲,没有默认构造函数的类,使用反射是无意义的,除非有一种机制能在反射时构建相应的构造函数的参数。因为这些类通常有更强的语义。

    希望有帮助。

    • 已标记为答案 极度 2011年1月19日 5:01
    2011年1月18日 13:36
    版主