如何检查某个通用接口的实现是否可用?

时间:2014-07-01 01:01:38

标签: c# generics interface system.reflection

如果我有一个界面 IEqualityCustomComparer<in T, in TClient>, 如何确定此接口是否已由特定类实现 public class ParticipantComparer : IEqualityCustomComparer<Participant, ParticipantEntity> { ... }

我所知道的是T是参与者类型,而TClient属于ParticipantEntity类型。我想检查这些类型的接口是否已经实现,并执行特定的代码片段,如果这是真的。

3 个答案:

答案 0 :(得分:0)

试试这个:

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

此代码将与数组中的变量一起使用,而不是typeof运算符,因为如果在编译时已知类型,则以下情况会更好。

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

答案 1 :(得分:0)

使用以下内容,它只是有效!

  ParticipantComparer theObject = new ParticipantComparer();

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

答案 2 :(得分:-1)

据我所知,这只能通过反思来完成。这是因为通用类型实现直到运行时才创建,并且您的代码无法知道它在编译时的内容。因此,反射节省了一天:

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

你最好的选择(避免反射性能惩罚)可能是一个标记界面......让IEqualityCustomComparer<,>实现IEqualityCustomComparer什么都不做,然后做一个软as或{{{ 1}}检查:

is