gpt4 book ai didi

c# - 动态调用方法和类名

转载 作者:太空狗 更新时间:2023-10-29 17:30:26 34 4
gpt4 key购买 nike

在某些情况下,我必须从类名中调用方法名。

string scenario1 = "MockScenario1";
string scenario2 = "MockScenario2";

MockScenario1.GetInfo();
MockScenario2.GetInfo();

我怎样才能动态地使用字符串来调用这里的方法名

scenario1.GetInfo()
scenario2.GetInfo()

我试图通过字符串和控制空格找出所有选项来查找相关选项。有什么建议吗?

我尝试了下面的方法并试图获取动态生成的类名

下面的代码动态生成方法名

string methodName = "hello";

//Get the method information using the method info class
MethodInfo mi = this.GetType().GetMethod(methodName);

//Invoke the method
// (null- no parameter for the method call
// or you can pass the array of parameters...)
mi.Invoke(this, null);

更清晰的场景:我正在尝试将类名作为参数发送MockScenario1 和 MockScenario2 是类名。

string scenarioCats = "MockScenario1";
string scenarioDogs = "MockScenario2";
GetResult(scenarioCats);
GetResult(scenarioDogs);

public static void GetCatsResult(string scenarioCats){
scenarioCats obj = new scenarioCats();
obj.GetInfo();
}
public static void GetDogsResult(string scenarioDogs){
scenarioDogs obj = new scenarioDogs();
obj.GetInfo();
}

最佳答案

如何从字符串表示中创建类型的实例:

string scenario1 = "TheNamespace.MockScenario1";
Type theType = this.GetType().Assembly.GetType(scenario1);
var theInstance = (MockScenario1)Activator.CreateInstance(theType);
theInstance.GetInfo();

如果您的类实现一个公共(public)接口(interface)会更好,例如 IGetInfoAware,然后您可以编写一个更通用的加载器:

var theInstance = (IGetInfoAware)Activator.CreateInstance(theType);

注意:您需要提供scenario1和scenario2的完整类名

参见 Activator.CreateInstance

编辑:

正如@Georg 所指出的,如果类型未在上下文对象的程序集中声明,则必须首先获取托管该类型的程序集:

var theAssembly = (
from Assembly assembly in AppDomain.CurrentDomain.GetAssemblies()
where (assembly.FullName == "TheNamespace.AssemblyName")
select assembly
)
.FirstOrDefault();

if ( theAssembly!= null ){
Type theType = theAssembly.GetType(scenario1);
var theInstance = (IGetInfoAware)Activator.CreateInstance(theType);
theInstance.GetInfo();
}

如果出于某种原因您不知道程序集名称,则可以按如下方式解析该类型:

public Type GetTypeFromString(String typeName)
{
foreach (Assembly theAssembly in AppDomain.CurrentDomain.GetAssemblies())
{
Type theType = theAssembly.GetType(typeName);
if (theType != null)
{
return theType;
}
}
return null;
}

关于c# - 动态调用方法和类名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40242977/

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