CSharp: Как мне динамически вызывать класс (с конструктором) и его методы? - PullRequest
2 голосов
/ 05 апреля 2011

Я читал примеры Reflection в течение двух дней, и я не могу собрать все вместе, чтобы соответствовать тому, что мне нужно. На самом деле я думал, что использую отражение, пока не заметил, что мое «использование System.Reflection» было серым. : -)

У меня есть XML-файл, который содержит имена моих классов и методы, содержащиеся в них. Порядок методов или даже имена могут измениться. Как только я прочитаю их, я хочу их выполнить. Кажется достаточно простым.

У меня есть следующий тестовый код:

    // myClassName = "namespace.TransactionServices"
    Type tb = Type.GetType(myClassName);

    // Classes will always have the same constructor
    object classInstance = Activator.CreateInstance (
        tb, 
        new object[] 
        {
            authorization.apiKey, 
            authorization.userName, 
            testData.servicesEndPoint
        });

    //Grab the method I want

    //myMethodName = "GetVersion"
    MethodInfo mymethod = tb.GetMethod(myMethodName);
    // no parameters for this method call
    object result = mymethod.Invoke(classInstance, null);

tb равно нулю. Я просто собирался поработать над попыткой получить правильный API для создания класса, но я даже не знаю, действительно ли остальная часть того, что у меня есть,

Есть предложения?

Спасибо

Редактировать: добавлено пространство имен. Activator.CreateInstance возвращает ошибку, что конструктор не найден .. Он есть.

Ответы [ 3 ]

3 голосов
/ 05 апреля 2011

Имя класса должно быть полностью определено (включая пространство имен и, скорее всего, сборку) для его разрешения.Если вы знаете, что класс находится в текущей исполняемой сборке, вы можете использовать Assembly.GetExecutingAssembly () .GetType ()

2 голосов
/ 05 апреля 2011

Вы уверены, что указали полное имя класса, включая пространство имен?без пространства имен результат будет нулевым.

0 голосов
/ 05 апреля 2011

Для GetType вы должны указать полное имя.Вы можете получить его для существующего объекта, используя

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