如何在C#中将字符串转换为动作?

时间:2013-09-19 13:09:17

标签: c# reflection

我将方法字符串名称发送到其他类中的MyFunction作为list中的参数。 现在我想像动作一样使用它们......我怎样才能将它们的名称转换为动作。?

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

事实上,我正在将我最喜欢的方法名称发送给我的班级来打电话给他们 我最初使用了Reflection ...但是我正在为我的类中的公共变量分配一些值。当反射生成新实例时,公共变量中的所有数据都将丢失。

4 个答案:

答案 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);
}

请参阅:MethodInfo.Invoke

答案 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)