Создание экземпляра типа с использованием отражения - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь использовать рефлексию для создания экземпляра одного из моих классов.Интерфейс для класса (IInstructions) имеет одну переменную, показанную ниже.

    string[] Operands { get; set; }

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

        Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
        Console.WriteLine(operands[0]);
        foreach (Assembly a in assemblies)
        {
            Type[] typeArray = a.GetTypes();
            foreach (Type type in typeArray)
            {
                if (opcode.Equals(type.Name, StringComparison.InvariantCultureIgnoreCase))
                {
                    Object dynamicObj = Activator.CreateInstance(type);
                    instruction = (IInstructionWithOperand)dynamicObj;

                }
            }
        }

Это пока что выполняет поиск по загруженным сборкам и извлекает правильную сборку и тип для этой сборки.Однако я не уверен, как установить переменную для этого типа и правильно создать его экземпляр?

1 Ответ

0 голосов
/ 06 декабря 2018

Если типом всегда является IInstructionWithOperand, вы можете объявить

IInstructionWithOperand instruction;

, а затем присвоить его точно так же, как вы:

instruction = (IInstructionWithOperand)dynamicObj;

Или предположим, что весь код вышенаходится в функции.Вы можете сделать IInstructionWithOperand типом возвращаемого значения функции, например

IInstructionWithOperand GetInstruction(string opcode)
{
    Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
    Console.WriteLine(operands[0]);
    foreach (Assembly a in assemblies)
    {
        Type[] typeArray = a.GetTypes();
        foreach (Type type in typeArray)
        {
            if (opcode.Equals(type.Name, StringComparison.InvariantCultureIgnoreCase))
            {
                Object dynamicObj = Activator.CreateInstance(type);
                return (IInstructionWithOperand)dynamicObj;
            }
        }
    }
} 

Вам не нужно объявлять переменную внутри функции.Когда вы вызываете функцию, она будет выглядеть следующим образом:

var instruction = GetInstruction(someOpCode);

и объявленный тип instruction будет IInstructionWithOperand.

В любом случае, это хорошая идея, потому что онахраните части вашего кода отдельно.Одна функция создает экземпляр класса, который реализует IInstructionWithOperand, а другая функция (или класс) использует его для выполнения чего-либо.

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