Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用反射访问构造函数_C#_Reflection_Constructor - Fatal编程技术网

C# 使用反射访问构造函数

C# 使用反射访问构造函数,c#,reflection,constructor,C#,Reflection,Constructor,假设类是公共的,构造函数是内部的,如 Public class A { private string text; internal A(string submittedText); public string StrText { get; } } 在这种情况下,如何使用反射访问构造函数。到目前为止我做了什么 Type[] pTypes = new Type[1]; pTypes[0] = typeof(object); object[] argList = ne

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

Public class A
{
    private string text;

    internal A(string submittedText);

    public string StrText { get; }
}
在这种情况下,如何使用反射访问构造函数。到目前为止我做了什么

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);
但它显示了一个错误。任何建议

试试这个:

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);
我从这个网站得到了帮助:

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

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);
        }
试试这个:

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);
我从这个网站得到了帮助:

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

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);
        }

我认为错误可能是由GetConstructor引起的,您传入的是对象类型而不是字符串类型

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);

我认为错误可能是由GetConstructor引起的,您传入的是对象类型而不是字符串类型

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);

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

pTypes[0] = typeof(string);

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

pTypes[0] = typeof(string);

您应该使用。

您应该使用。

您可以使用
object o1=Activator.CreateInstance(typeof(myclass),true)用于创建实例。在相同的方法中创建实例不需要经过那些复杂的代码。

您可以使用
object o1=Activator.CreateInstance(typeof(myclass),true)用于创建实例。在相同的方法中创建实例不需要经过复杂的代码。

c为空,其中as c应为Ac的实例为空,而as c应为AThanks的实例。它现在正在工作,但它没有设置属性“StrText”的值任何建议发布的StrText是只读的?!如果您的意思是在构造期间设置值,请尝试:object objA=ctr.Invoke(new object[]{“Some Text”});谢谢..它现在正在工作,但它没有设置属性“StrText”的值任何建议您发布的StrText是只读的?!如果您的意思是在构造期间设置值,请尝试:object objA=ctr.Invoke(new object[]{“Some Text”});