动态调用方法和类名 [英] Dynamically calling method and class name
问题描述
在某些情况下,我必须从类名中调用方法名。
I have some cases where I have to call method names from class names.
string scenario1 = "MockScenario1";
string scenario2 = "MockScenario2";
MockScenario1.GetInfo();
MockScenario2.GetInfo();
如何动态地使用字符串在此处调用方法名称
How can I dynamically use the strings to call method name here like
scenario1.GetInfo()
scenario2.GetInfo()
我试图通过字符串找出所有选项并控制空间以找到相关的选项。有什么建议吗?
I tried to find out all options by string and control space to find related options. Any suggestions?
我在下面尝试了并尝试获取动态生成的类名
I am tried the below and trying to Get class name generated dynamically
下面的代码生成了动态方法名称
The below code generated method name dynamically
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是类名。
More clear scenario: I am trying to send class name as parameter MockScenario1 and MockScenario2 are class names.
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();
}
推荐答案
如何创建实例从其字符串表示形式中得到的类型:
How to create an instance of a type from its string representation:
string scenario1 = "TheNamespace.MockScenario1";
Type theType = this.GetType().Assembly.GetType(scenario1);
var theInstance = (MockScenario1)Activator.CreateInstance(theType);
theInstance.GetInfo();
如果您的类实现了公共接口,例如 IGetInfoAware ,然后可以编写一个更通用的加载器:
It will be better if your classes implement a common interface, for example IGetInfoAware, and then you could write a more generic loader:
var theInstance = (IGetInfoAware)Activator.CreateInstance(theType);
注意:您需要提供方案1和方案2的完整类名
Note: you need to provide the full class name for scenario1 and scenario2
编辑:
为@ Georg指出,如果未在上下文对象的程序集中声明该类型,则必须首先获取托管该类型的程序集:
As @Georg pointed out, if the type is not declared in the assembly of the context objects, then it is necessary first to get the assembly where the type is hosted:
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();
}
如果由于某种原因您不知道程序集名称,则该类型可以可以像下面这样解决:
If for some reason the assembly name is unknown to you, then the type could be resolved like the following:
public Type GetTypeFromString(String typeName)
{
foreach (Assembly theAssembly in AppDomain.CurrentDomain.GetAssemblies())
{
Type theType = theAssembly.GetType(typeName);
if (theType != null)
{
return theType;
}
}
return null;
}
这篇关于动态调用方法和类名的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!