如何检查实现是否可用于某个泛型接口

本文关键字:用于 泛型接口 是否 实现 何检查 检查 | 更新日期: 2023-09-27 18:10:49

如果我有一个接口IEqualityCustomComparer<in T, in TClient>,我如何发现这个接口是否已经由特定的类实现,比如public class ParticipantComparer : IEqualityCustomComparer<Participant, ParticipantEntity> { ... } .

我只知道T的类型是Participant, TClient的类型是participententity。我想检查这些类型的接口是否已经实现,如果是真的,则执行一段特定的代码。

如何检查实现是否可用于某个泛型接口

使用下面的代码,它就可以工作了!

  ParticipantComparer theObject = new ParticipantComparer();
  if (typeof(IEqualityCustomComparer<Participant, ParticipantEntity>).IsInstanceOfType(theObject))
            {
                Console.WriteLine("Assignable");
            }

试试这个:

var isImplementationOf =
    typeof(IEqualityCustomComparer<,>)
        .MakeGenericType(new []
        {
            typeof(Participant),
            typeof(ParticipantEntity),
        })
        .IsAssignableFrom(typeof(ParticipantComparer));

此代码将用于数组中的变量,而不是typeof操作符,因为如果在编译时知道类型,则下面的代码会更好。

var isImplementationOf =
    typeof(IEqualityCustomComparer<Participant, ParticipantEntity>)
        .IsAssignableFrom(typeof(ParticipantComparer));

据我所知,这只能通过反射来完成。这是因为直到运行时才创建泛型类型实现,您的代码不可能知道它在编译时将是什么。因此,反射节省了一天:

bool result = type.GetInterfaces()
    .Any(i => i.IsGenericType 
        && i.GetGenericTypeDefinition() == typeof(IEqualityCustomComparer<,>));

你最好的选择(避免反射性能损失)可能是一个标记接口…让IEqualityCustomComparer<,>实现IEqualityCustomComparer,不做任何事情,然后做一个软asis检查:

if (customClass is IEqualityCustomComparer)
...