从字符串调用动态方法

时间:2015-05-17 16:02:10

标签: c# dynamic methods reflection

我试图从动态调用方法而不知道它的名字。我很难用英语解释这个,所以有代码:

public void CallMethod(dynamic d, string n)
{
    // Here I want to call the method named n in the dynamic d
}

我想要类似:d.n() n 替换为字符串。

我想要这个:

Type thisType = this.GetType();
MethodInfo theMethod = thisType.GetMethod(TheCommandString);
theMethod.Invoke(this, userParameters);

动态

如果您需要上下文来帮助您:我创建了一个支持“mods”的应用程序,您将DLL放在mod文件夹中并加载并执行它。它适用于动态(我有这样的词典:Dictionnary<string, dynamic> instances;)。我希望应用程序从库中获取方法名称(使用instances["topkek"].GetMethods();,我已经创建了此方法)但是然后使用它返回的字符串调用该方法。我不知道我说的是什么意思(我是法国人:/)......

我正在使用带有.Net framework 4.5的VS 2013 Express,如果您需要更多信息来帮助我问我。

3 个答案:

答案 0 :(得分:3)

您可以按如下方式编写方法 -

public void CallMethod(dynamic d, string n)
    {
        d.GetType().GetMethod(n).Invoke(d, null);
    }

答案 1 :(得分:1)

如果所有方法都无效,这可能会有效。否则你需要稍微改变一下。

    public void CallMethod(string className, string methodName)
    {
        object dynamicObject;
        // Here I want to call the method named n in the dynamic d
        string objectClass = "yourNamespace.yourFolder." + className;
        Type objectType = Type.GetType(objectClass);
        if (objectType == null)
        {
            // Handle here unknown dynamic objects
        }
        else
        {
            // Call here the desired method
            dynamicObject = Activator.CreateInstance(objectType);
            System.Reflection.MethodInfo method = objectType.GetMethod(methodName);
            if (method == null)
            {
                // Handle here unknown method for the known dynamic object
            }
            else
            {
                object[] parameters = new object[] { };   // No parameters
                method.Invoke(dynamicObject, parameters);
            }
        }
    }

答案 2 :(得分:0)

我想添加另一种方法作为解决方案:

在您的情况下,调用者(mod的开发者)知道调用方法。因此,这可能会有所帮助:

// In the main application:
public dynamic PerformMethodCall(dynamic obj, Func<dynamic, dynamic> method)
{
    return method(obj);
{


 // In a mod:
 mainProgram.PerformMethodCall(myDynamicObj, n => n.myDynamicMethod());

 // In another mod:
 mainProgram.PerformMethodCall(myDynamicObj, n => n.anotherMethod());

这是尤瓦尔·伊茨查科夫(Yuval Itzchakov)在其评论中的想法的进一步发展。他曾建议使用一名代表。