1

让我先说我对反思完全陌生。

我有Dictionary一个stringto Func<string, string>。我想添加一个配置部分,允许我定义可以以编程方式添加到此字典中的静态方法的名称。

所以基本上,我会有这样的事情:

public static void DoSomething()
{
    string MethodName = "Namespace.Class.StaticMethodName";

    // Somehow convert MethodName into a Func<string, string> object that can be 
    // passed into the line below

    MyDictionary["blah"] = MethodNameConvertedToAFuncObject;
    MyDictionary["foo"] = ANonReflectiveMethod;

    foreach(KeyValuePair<string, Func<string, string>> item in MyDictionary)
    {
        // Calling method, regardless if it was added via reflection, or not
        Console.WriteLine(item.Value(blah));
    }
}

public static string ANonReflectiveMethod(string AString)
{
    return AString;
}

是否可以这样做,或者我是否需要通过反射调用所有内容?

4

1 回答 1

4

我想你要找的只是Delegate.CreateDelegate. 您需要将获得的名称分解为类名和方法名。然后,您可以使用Type.GetType()获取类型,然后Type.GetMethod()获取MethodInfo,然后使用:

var func = (Func<string, string>) Delegate.CreateDelegate(
                            typeof(Func<string, string>), methodInfo);

创建委托后,您可以毫无问题地将其放入字典中。

所以像:

static Func<string, string> CreateFunction(string typeAndMethod)
{
    // TODO: *Lots* of validation
    int lastDot = typeAndMethod.LastIndexOf('.');
    string typeName = typeAndMethod.Substring(0, lastDot);
    string methodName = typeAndMethod.Substring(lastDot + 1);
    Type type = Type.GetType(typeName);
    MethodInfo method = type.GetMethod(methodName, new[] { typeof(string) });
    return (Func<string, string>) Delegate.CreateDelegate(
        typeof(Func<string, string>), method);
}

请注意,它Type.GetType()只会在当前执行的程序集中查找类型,或者mscorlib除非您实际指定了程序集限定名称。只是需要考虑的事情。Assembly.GetType()如果您已经知道要在其中找到该方法的程序集,则可能要使用该程序集。

于 2013-09-27T19:28:53.370 回答