如果我有一个界面
IEqualityCustomComparer<in T, in TClient>
,
如何确定此接口是否已由特定类实现
public class ParticipantComparer : IEqualityCustomComparer<Participant, ParticipantEntity> { ... }
。
我所知道的是T是参与者类型,而TClient属于ParticipantEntity类型。我想检查这些类型的接口是否已经实现,并执行特定的代码片段,如果这是真的。
答案 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