我正在尝试使用在这篇文章中找到的类,但它需要一个 MethodBase 才能运行。
我阅读了获取 MethodBase 对象的最快方法是什么?但我无法找到任何解决方案。
我需要做的是从函数中获取 MethodBase 对象。
例如获取类 Console 的静态函数 WriteLine() 的 MethodBase 或获取 List<> 的非静态函数 Add() 的 MethodBase。
谢谢你的帮助!
我正在尝试使用在这篇文章中找到的类,但它需要一个 MethodBase 才能运行。
我阅读了获取 MethodBase 对象的最快方法是什么?但我无法找到任何解决方案。
我需要做的是从函数中获取 MethodBase 对象。
例如获取类 Console 的静态函数 WriteLine() 的 MethodBase 或获取 List<> 的非静态函数 Add() 的 MethodBase。
谢谢你的帮助!
方法一
您可以直接使用反射:
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 的附加参数来检索正确的参数。
如果方法是泛型的并且您不知道静态类型参数,则需要检索打开方法的 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
方法二
一些第三方库可以帮助您解决这个问题。使用SixPack.Reflection,您可以执行以下操作:
MethodBase writeLine = MethodReference.Get(
// Actual argument values of WriteLine are ignored.
// They are needed only to resolve the overload
() => Console.WriteLine("", null)
);