使用Reflection访问构造函数

时间:2010-05-21 09:09:04

标签: c# reflection constructor

假设该类是公共的,并且构造函数是内部的,如

Public class A
{
    private string text;

    internal A(string submittedText);

    public string StrText { get; }
}

在这种情况下,我如何使用Reflection访问构造函数。到目前为止我做了什么

Type[] pTypes = new Type[1];

pTypes[0] = typeof(object);

object[] argList = new object[1];

argList[0] = "Some Text";


ConstructorInfo c = typeof(A).GetConstructor
                (BindingFlags.NonPublic |
                 BindingFlags.Instance,
                 null,
                 pTypes,
                 null);


A foo = (A)c.Invoke(BindingFlags.NonPublic,
                    null,
                    argList,
                    Application.CurrentCulture);

但它显示错误。任何建议

5 个答案:

答案 0 :(得分:3)

我认为错误可能是由GetConstructor引起的,你传入了Object类型而不是String类型。

var ctr = typeof(A).GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, null, new Type[] { typeof(String) }, null);

顺便说一句,如果类型A本身是内部的,并且您知道同一程序集中的公共类型B和A,则可以尝试:

Type typeA = typeof(B).Assembly.GetType("Namespace.AssemblyName.A", false);
var ctr = typeA.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, null, new Type[] { typeof(String) }, null);

答案 1 :(得分:2)

试试这个:

Type type = typeof(A);

            Type[] argTypes = new Type[] { typeof(String) };

            ConstructorInfo cInfo = type.GetConstructor(argTypes);

            object[] argVals = new object[] { "Some string" };
            Ap = (A)cInfo.Invoke(argVals);

我从这个网站得到了帮助:

http://www.java2s.com/Code/CSharp/Reflection/CallGetConstructortogettheconstructor.htm

我刚试了一个示例控制台应用程序,在那里我有一个内部类,它可以工作。

namespace ConsoleApplication1
{
    internal class Person
    {
        public Person(string name)
        {
            Name = name;
        }

        public string Name { get; set; }
    }
}

public static void Main()
        {

            Type type = typeof(Person);

            Type[] argTypes = new Type[] { typeof(String) };

            ConstructorInfo cInfo = type.GetConstructor(argTypes);

            object[] argVals = new object[] { "Some string" };
            Person p = (Person)cInfo.Invoke(argVals);
        }

答案 2 :(得分:1)

构造函数中的参数类型是字符串,而不是对象。所以也许这样:

pTypes[0] = typeof(string);

答案 3 :(得分:0)

您应该使用Activator.CreateInstance

答案 4 :(得分:0)

您可以使用object o1 = Activator.CreateInstance(typeof (myclass), true);创建实例。无需通过复杂的代码来在同一方法中创建实例。