使用反射创建类型的实例

时间:2018-12-05 20:43:09

标签: c# reflection

我正在尝试使用反射来创建我的一个类的实例。该类(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 :(得分:0)

如果类型始终为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的类的实例,而另一个函数(或类)使用它来做某事。