我将方法字符串名称发送到其他类中的MyFunction作为list中的参数。 现在我想像动作一样使用它们......我怎样才能将它们的名称转换为动作。?
public void MyFunction(List<string> Methodlist)
{
foreach (string Method in Methodlist)
{
Method();
}
事实上,我正在将我最喜欢的方法名称发送给我的班级来打电话给他们 我最初使用了Reflection ...但是我正在为我的类中的公共变量分配一些值。当反射生成新实例时,公共变量中的所有数据都将丢失。
答案 0 :(得分:3)
您不仅可以使用方法名称,因为您正在丢失对象的实例。使用:
public void MyFunction(List<Action> actions)
{
foreach (Action action in actions)
{
action();
}
如果你仍然坚持使用methodname作为字符串,你应该提供一个实例对象,你也知道它有哪些参数?
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[] { });
}
}
但我不会建议这样的编码风格!
答案 1 :(得分:1)
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);
}
答案 2 :(得分:1)
你可以试试这个:
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
类型,如评论和其他答案所示。
答案 3 :(得分:-1)
使用System.Reflection
Createinstance:http://msdn.microsoft.com/en-us/library/system.reflection.assembly.aspx
调用方法:http://msdn.microsoft.com/en-US/library/vstudio/a89hcwhh.aspx