Type.FindInterfaces(TypeFilter, Object) 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
public:
virtual cli::array <Type ^> ^ FindInterfaces(System::Reflection::TypeFilter ^ filter, System::Object ^ filterCriteria);
[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.Interfaces)]
public virtual Type[] FindInterfaces(System.Reflection.TypeFilter filter, object? filterCriteria);
public virtual Type[] FindInterfaces(System.Reflection.TypeFilter filter, object? filterCriteria);
public virtual Type[] FindInterfaces(System.Reflection.TypeFilter filter, object filterCriteria);
[<System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.Interfaces)>]
abstract member FindInterfaces : System.Reflection.TypeFilter * obj -> Type[]
override this.FindInterfaces : System.Reflection.TypeFilter * obj -> Type[]
abstract member FindInterfaces : System.Reflection.TypeFilter * obj -> Type[]
override this.FindInterfaces : System.Reflection.TypeFilter * obj -> Type[]
Public Overridable Function FindInterfaces (filter As TypeFilter, filterCriteria As Object) As Type()
参数
- filter
- TypeFilter
与接口进行比较的 filterCriteria委托。
- filterCriteria
- Object
确定接口是否应包含在返回的数组中的搜索条件。
返回
表示由当前Type实现或继承的接口的筛选列表的对象数组Type;如果没有与筛选器匹配的接口匹配的接口的数组,则为空数组。如果当前Type接口没有匹配的接口,则为空数组。
实现
- 属性
例外
filter 是 null。
调用静态初始值设定项并引发异常。
示例
以下示例查找由指定类型实现或继承的指定接口,然后显示接口名称。
using System;
using System.Xml;
using System.Reflection;
public class MyFindInterfacesSample
{
public static void Main()
{
try
{
XmlDocument myXMLDoc = new XmlDocument();
myXMLDoc.LoadXml("<book genre='novel' ISBN='1-861001-57-5'>" +
"<title>Pride And Prejudice</title>" + "</book>");
Type myType = myXMLDoc.GetType();
// Specify the TypeFilter delegate that compares the
// interfaces against filter criteria.
TypeFilter myFilter = new TypeFilter(MyInterfaceFilter);
String[] myInterfaceList = new String[2]
{"System.Collections.IEnumerable",
"System.Collections.ICollection"};
for(int index=0; index < myInterfaceList.Length; index++)
{
Type[] myInterfaces = myType.FindInterfaces(myFilter,
myInterfaceList[index]);
if (myInterfaces.Length > 0)
{
Console.WriteLine("\n{0} implements the interface {1}.",
myType, myInterfaceList[index]);
for(int j =0;j < myInterfaces.Length;j++)
Console.WriteLine("Interfaces supported: {0}.",
myInterfaces[j].ToString());
}
else
Console.WriteLine(
"\n{0} does not implement the interface {1}.",
myType,myInterfaceList[index]);
}
}
catch(ArgumentNullException e)
{
Console.WriteLine("ArgumentNullException: " + e.Message);
}
catch(TargetInvocationException e)
{
Console.WriteLine("TargetInvocationException: " + e.Message);
}
catch(Exception e)
{
Console.WriteLine("Exception: " + e.Message);
}
}
public static bool MyInterfaceFilter(Type typeObj,Object criteriaObj)
{
if(typeObj.ToString() == criteriaObj.ToString())
return true;
else
return false;
}
}
open System
open System.Xml
open System.Reflection
let myInterfaceFilter (typeObj: Type) (criteriaObj: obj) =
string typeObj = string criteriaObj
try
let myXMLDoc = XmlDocument()
myXMLDoc.LoadXml("<book genre='novel' ISBN='1-861001-57-5'>" + "<title>Pride And Prejudice</title>" + "</book>")
let myType = myXMLDoc.GetType()
// Specify the TypeFilter delegate that compares the
// interfaces against filter criteria.
let myFilter = TypeFilter myInterfaceFilter
let myInterfaceList =
[ "System.Collections.IEnumerable"
"System.Collections.ICollection" ]
for i in myInterfaceList do
let myInterfaces = myType.FindInterfaces(myFilter, i)
if myInterfaces.Length > 0 then
printfn $"\n{myType} implements the interface {i}."
for j in myInterfaces do
printfn $"Interfaces supported: {j}."
else
printfn $"\n{myType} does not implement the interface {i}."
with
| :? ArgumentNullException as e ->
printfn $"ArgumentNullException: {e.Message}"
| :? TargetInvocationException as e ->
printfn $"TargetInvocationException: {e.Message}"
| e ->
printfn $"Exception: {e.Message}"
Imports System.Xml
Imports System.Reflection
Public Class MyFindInterfacesSample
Public Shared Sub Main()
Try
Dim myXMLDoc As New XmlDocument()
myXMLDoc.LoadXml("<book genre='novel' ISBN='1-861001-57-5'>" _
& "<title>Pride And Prejudice</title>" & "</book>")
Dim myType As Type = myXMLDoc.GetType()
' Specify the TypeFilter delegate that compares the
' interfaces against filter criteria.
Dim myFilter As New TypeFilter(AddressOf MyInterfaceFilter)
Dim myInterfaceList() As String = _
{"System.Collections.IEnumerable", _
"System.Collections.ICollection"}
Dim index As Integer
For index = 0 To myInterfaceList.Length - 1
Dim myInterfaces As Type() = _
myType.FindInterfaces(myFilter, myInterfaceList(index))
If myInterfaces.Length > 0 Then
Console.WriteLine(ControlChars.Cr & _
"{0} implements the interface {1}.", _
myType, myInterfaceList(index))
Dim j As Integer
For j = 0 To myInterfaces.Length - 1
Console.WriteLine("Interfaces supported: {0}", _
myInterfaces(j).ToString())
Next j
Else
Console.WriteLine(ControlChars.Cr & _
"{0} does not implement the interface {1}.", _
myType, myInterfaceList(index))
End If
Next index
Catch e As ArgumentNullException
Console.WriteLine("ArgumentNullException: " & e.Message)
Catch e As TargetInvocationException
Console.WriteLine("TargetInvocationException: " & e.Message)
Catch e As Exception
Console.WriteLine("Exception: " & e.Message)
End Try
End Sub
Public Shared Function MyInterfaceFilter(ByVal typeObj As Type, _
ByVal criteriaObj As [Object]) As Boolean
If typeObj.ToString() = criteriaObj.ToString() Then
Return True
Else
Return False
End If
End Function 'MyInterfaceFilter
End Class
注解
此方法可由派生类重写。
Module.FilterTypeName还可以使用类提供的Module.FilterTypeNameIgnoreCase委托和System.Reflection.Module委托,而不是System.Reflection.TypeFilter委托。
此类实现的所有接口都是在搜索期间考虑的,无论是由基类还是此类本身声明。
此方法搜索基类层次结构,返回每个类实现的每个匹配接口以及每个接口实现的所有匹配接口(即返回匹配接口的可传递关闭)。 不会返回重复接口。
如果当前 Type 在泛型类型或泛型方法的定义中表示类型参数, FindInterfaces 则搜索类型参数的约束中声明的所有接口,以及通过约束中声明的接口继承的所有接口。 如果当前 Type 表示泛型类型的类型参数, FindInterfaces 则搜索类型实现的所有接口,无论它们是否与约束匹配。
注释
FindInterfaces 可以返回泛型接口,即使在非泛型类型上也是如此。 例如,非泛型类型可能实现 IEnumerable<int>(Visual Basic 中的 IEnumerable(Of Integer))。