使用反射來識別擴展方法
在C# 中,擴展方法提供了一種便捷的方法,可以在不修改原始類型的情況下為現有類型新增功能類別定義。確定擴展方法是否已添加到類別中在各種場景中都很有用,例如單元測試或確保正確實現。
要使用反射辨識擴充方法,必須先查看擴充所在的組件可以定義方法。識別用 ExtensionAttribute 屬性修飾的類別並檢查這些類別中的方法。任何以 ExtensionAttribute 標記且其第一個參數類型與您正在研究的類型相符的方法都是擴充方法。
using System; using System.Runtime.CompilerServices; using System.Reflection; using System.Linq; using System.Collections.Generic; public static class FirstExtensions { public static void Foo(this string x) { } public static void Bar(string x) { } // Not an ext. method public static void Baz(this int x) { } // Not on string } public static class SecondExtensions { public static void Quux(this string x) { } } public class Test { static void Main() { Assembly thisAssembly = typeof(Test).Assembly; foreach (MethodInfo method in GetExtensionMethods(thisAssembly, typeof(string))) { Console.WriteLine(method); } } static IEnumerable<MethodInfo> GetExtensionMethods(Assembly assembly, Type extendedType) { var isGenericTypeDefinition = extendedType.IsGenericType && extendedType.IsTypeDefinition; var query = from type in assembly.GetTypes() where type.IsSealed && !type.IsGenericType && !type.IsNested from method in type.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic) where method.IsDefined(typeof(ExtensionAttribute), false) where isGenericTypeDefinition ? method.GetParameters()[0].ParameterType.IsGenericType && method.GetParameters()[0].ParameterType.GetGenericTypeDefinition() == extendedType : method.GetParameters()[0].ParameterType == extendedType select method; return query; } }
在此範例中,GetExtensionMethods 識別 thisAssembly 程式集中字串類型的所有擴充方法。它收集用 ExtensionAttribute 修飾的類型,並檢查其方法是否有適當的參數類型和 ExtensionAttribute。
以上是如何使用反射來識別 C# 中的擴展方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!