gpt4 book ai didi

c# - 使用反射创建类型的实例

转载 作者:太空宇宙 更新时间:2023-11-03 14:47:09 25 4
gpt4 key购买 nike

我正在尝试使用反射来创建我的其中一个类的实例。类 (IInstructions) 的接口(interface)有一个变量,如下所示。

    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;

}
}
}

到目前为止,这会搜索加载的程序集并检索正确的程序集和该程序集的类型。但是,我不确定如何为此类型设置变量并正确创建它的实例?

最佳答案

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

关于c# - 使用反射创建类型的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53640427/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com