如何检查实现是否可用于某个泛型接口
本文关键字:用于 泛型接口 是否 实现 何检查 检查 | 更新日期: 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
,不做任何事情,然后做一个软as
或is
检查:
if (customClass is IEqualityCustomComparer)
...