在给定方法名称的情况下,我需要知道如何找到给定Type
的扩展方法。通常的反射方法不起作用。
例如,System.Data.DataTable
类型在调用GetMembers
时,不会在结果中返回AsEnumerable
。
为了证实这一点,我跑了:
Dim Query = From MemberInfo As MemberInfo
In GetType(DataTable).GetMembers
Select MemberName = MemberInfo.Name
Order By MemberName
For Each MemberName As String In Query.ToList
Debug.WriteLine(MemberName)
Next
请注意,System.Data.DataSetExtensions
被添加为参考,并且有一个"使用" ({1}}
我正在寻找合适的代码来获取System.Data
的{{1}}。
另请注意,我不会在运行时知道MemberInfo
,我只是将其作为具体示例使用,因此我无法对AsEnumerable
的解决方案进行硬编码。我确实意识到问题出在其他地方,并不是Type
方法所特有的,但我想通过一个问题/解决方案的具体例子,我可以推断出它可以与每个DataTable
一起使用。
编辑:我的解决方案
致电代码:
DataTable
图书馆代码:
Type
答案 0 :(得分:2)
这是因为AsEnumerable
是extension method provided by DataTableExtensions
类。您需要将其称为纯静态方法:
Dim T As Type
T = TypeOf DataTableExtensions
Dim M As Reflection.MethodInfo = T.GetMethod("AsEnumerable")
...
我需要能够发现
MemberInfo
...
没有通用的方法来发现所有扩展方法,而无需详尽了解您提供的程序集中的所有类,查找所有可访问的static
方法,并检查它们与第一个参数的特定参数类型的兼容性和ExtensionAttribute
。
本Q& A提供了有关通过反思发现扩展方法的更多信息:link。