2

我想通过存储在列表中的方法名称调用该方法。任何人都可以帮忙吗?我是 C# 的新手!

{
   delegate string ConvertsIntToString(int i);
}

class Program
{
    public static List<String> states = new List<string>() { "dfd","HiThere"};
    static void Main(string[] args)
    {
        ConvertsIntToString someMethod = new ConvertsIntToString(states[1]);
        string message = someMethod(5);
        Console.WriteLine(message);
        Console.ReadKey();
    }
    private static string HiThere(int i)
    {
        return "Hi there! #" + (i * 100);
    }
 }
4

1 回答 1

3

看起来您根本不需要Delegate.DynamicInvoke-您不是在尝试动态调用它-您正在尝试动态创建委托,您可以使用Delegate.CreateDelegate. 基于您的示例的简短但完整的程序(但不使用列表 - 这里不需要):

using System;
using System.Reflection;

delegate string ConvertsIntToString(int i);

class Program
{
    static void Main(string[] args)
    {
        // Obviously this can come from elsewhere
        string name = "HiThere";

        var method = typeof(Program).GetMethod(name, 
                                               BindingFlags.Static | 
                                               BindingFlags.NonPublic);
        var del = (ConvertsIntToString) Delegate.CreateDelegate
            (typeof(ConvertsIntToString), method);

        string result = del(5);
        Console.WriteLine(result);
    }

    private static string HiThere(int i)
    {
        return "Hi there! #" + (i * 100);
    }
 }

显然,如果你想要的方法是不同的类型,或者是实例方法,或者是公共的,你需要调整它。

于 2012-06-29T22:53:21.950 回答