我正在尝试使用反射来创建我的一个类的实例。该类(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;
}
}
}
到目前为止,这一直在搜索已加载的程序集,并检索该程序集的正确程序集和类型。但是,我不确定如何为此类型设置变量并正确创建它的实例?
答案 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
的类的实例,而另一个函数(或类)使用它来做某事。