0

我将我的方法字符串名称作为列表中的参数发送到其他类中的 MyFunction。现在我想像操作一样使用它们...如何将它们的名称转换为操作。?

 public void MyFunction(List<string> Methodlist)
    {
        foreach (string Method in Methodlist)
        {
            Method(); 
        }

事实上,我将我最喜欢的方法名称发送到我的班级以调用它们我起初使用反射......但我正在为我的班级中的公共变量分配一些值......当反射创建新实例时,我在公共变量中的所有数据丢失了。

4

4 回答 4

3

您不能只使用方法名称,因为您正在丢失对象的实例。利用 :

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[] { });
    }
}

但我不建议这种编码风格!

于 2013-09-19T13:14:27.573 回答
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)你不应该真的这样做 - 考虑使用Actiontype 代替,如评论和其他答案中所建议的那样。

于 2013-09-19T13:20:30.133 回答
1

AList<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

于 2013-09-19T13:18:33.203 回答
-1

使用 System.Reflection

创建实例:http: //msdn.microsoft.com/en-us/library/system.reflection.assembly.aspx

调用方法:http: //msdn.microsoft.com/en-US/library/vstudio/a89hcwhh.aspx

于 2013-09-19T13:17:36.270 回答