给定扩展的Type和方法名称,如何查找扩展方法

时间:2014-12-31 15:56:38

标签: .net reflection

在给定方法名称的情况下,我需要知道如何找到给定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

1 个答案:

答案 0 :(得分:2)

这是因为AsEnumerableextension 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