如何在 C# 中将字符串转换为操作
本文关键字:字符串 转换 操作 | 更新日期: 2023-09-27 18:31:53
我将我的方法字符串名称作为列表中的参数发送到其他类中的MyFunction。现在我想像一个动作一样使用它们......如何将它们的名称转换为操作。?
public void MyFunction(List<string> Methodlist)
{
foreach (string Method in Methodlist)
{
Method();
}
事实上,我正在将我最喜欢的方法名称发送到我的班级以调用它们我一开始使用反射...但是我正在为类中的公共变量分配一些值。当反射创建新实例时,我在公共变量中的所有数据都会丢失。
不能只使用方法名称,因为会丢失对象的实例。用:
public void MyFunction(List<Action> actions)
{
foreach (Action action in actions)
{
action();
}
如果你仍然坚持将字符串作为方法名,你应该提供一个实例对象,你也知道有什么参数吗?
public void MyFunction(object instance, List<string> methodNames)
{
Type instanceType = instance.GetType();
foreach (string methodName in methodNames)
{
MethodInfo methodInfo = instanceType.GetMethod(methodName);
// do you know any parameters??
methodInfo.Invoke(instance, new object[] { });
}
}
但我不建议这样的编码风格!
你可以试试这个:
public void MyFunction(List<string> methodlist)
{
foreach (string methodName in methodlist)
{
this.GetType().GetMethod(methodName).Invoke(this, null);
}
或者,如果要在另一个实例上调用它们:
public void MyFunction(object instance, List<string> methodlist)
{
foreach (string methodName in methodlist)
{
instance.GetType().GetMethod(methodName).Invoke(instance, null);
}
请注意:
1)您应该将object
更改为您的类型名称,我只是把它放在那里,因为您没有提供整个上下文
2)你真的不应该这样做 - 考虑使用Action
类型,正如评论和其他答案中所建议的那样。
List<Action>
是执行某些远程代码的更好数据类型。可以使用反射从方法的名称中获取方法,但还需要关联的类实例和方法参数。
行动:
var actionList= new List<Action>();
actionList.Add(() => SomeAwesomeMethod());
actionList.Add(() => foo.MyOtherAwesomeMethod());
actionList.Add(() => bar.ThisWillBeAwesome(foo));
foreach(var action in actionList)
{
action();
}
请参阅: Action
反射:
var methods = new List<string>();
methods.Add("SomeAwesomeMethod");
foreach(var item in methods)
{
var method = this.GetType().GetMethod(item);
method.Invoke(this, null);
}
请参阅:MethodInfo.Invoke
Use System.Reflection
创建实例 : http://msdn.microsoft.com/en-us/library/system.reflection.assembly.aspx
调用方法: http://msdn.microsoft.com/en-US/library/vstudio/a89hcwhh.aspx