Доступ к конструктору с помощью Reflection - PullRequest
0 голосов
/ 21 мая 2010

Предположим, что класс общедоступен, а конструктор является внутренним, как

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 ]

3 голосов
/ 21 мая 2010

Я думаю, что ошибка может быть вызвана GetConstructor, вы передали тип объекта вместо типа 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);
2 голосов
/ 21 мая 2010

Попробуйте это:

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);
        }
1 голос
/ 21 мая 2010

Тип аргумента в конструкторе - строка, а не объект. Так может быть так:

pTypes[0] = typeof(string);
0 голосов
/ 21 мая 2010

вы можете использовать object o1 = Activator.CreateInstance(typeof (myclass), true); для создания экземпляра. нет необходимости проходить этот сложный код для создания экземпляров одним и тем же методом.

0 голосов
/ 21 мая 2010

Вы должны использовать Activator.CreateInstance.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...