1

私はリフレクションにまったく慣れていないと言って、これを前置きさせてください。

私は ~ を持ってDictionarystringます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 に答える