8

この投稿にあるクラスを使用しようとしていますが、実行するには MethodBase が必要です。

MethodBaseオブジェクトを取得する最速の方法は何ですか? しかし、私は解決策を得ることができませんでした。

私がする必要があるのは、関数から MethodBase オブジェクトを取得することです。

たとえば、クラス Console の静的関数 WriteLine() の MethodBase を取得するか、List<> の非静的関数 Add() の MethodBase を取得します。

ご協力いただきありがとうございます!

4

1 に答える 1

14

方法1

リフレクションを直接使用できます。

MethodBase writeLine = typeof(Console).GetMethod(
    "WriteLine", // Name of the method
    BindingFlags.Static | BindingFlags.Public, // We want a public static method
    null,
    new[] { typeof(string), typeof(object[]) }, // WriteLine(string, object[]),
    null
);

Console.Writeline()の場合、そのメソッドには多くのオーバーロードがあります。正しいパラメータを取得するには、GetMethodの追加パラメータを使用する必要があります。

メソッドが汎用であり、type引数が静的にわからない場合は、openメソッドのMethodInfoを取得してから、パラメーター化する必要があります。

// No need for the other parameters of GetMethod because there
// is only one Add method on IList<T>
MethodBase listAddGeneric = typeof(IList<>).GetMethod("Add");

// listAddGeneric cannot be invoked because we did not specify T
// Let's do that now:
MethodBase listAddInt = listAddGeneric.MakeGenericMethod(typeof(int));
// Now we have a reference to IList<int>.Add

方法2

一部のサードパーティライブラリは、これを支援することができます。SixPack.Reflectionを使用すると、次のことができます。

MethodBase writeLine = MethodReference.Get(
    // Actual argument values of WriteLine are ignored.
    // They are needed only to resolve the overload
    () => Console.WriteLine("", null)
);
于 2011-07-28T09:16:37.820 に答える