[英]Return types of generic interface implementations from a provided type
给定一个实现接口的类:
public interface DomainEventSubscriber<T>
{
void HandleEvent(T domainEvent);
}
public class TestEventHandler : DomainEventSubscriber<TestEvent1>, DomainEventSubscriber<OtherTestEvent1>
{
public void HandleEvent(TestEvent1 domainEvent)
{
}
public void HandleEvent(OtherTestEvent1 domainEvent)
{
throw new NotImplementedException();
}
}
我想返回实现的类型,即
static Type[] FindTypesForDomainEventSubscriberOfT(Type type)
{
// given a TestEventHandler type, I should return a collection of { TestEvent1, OtherTestEvent1 }
}
请问该怎么做?
听起来您想要这样的东西:
static Type[] FindTypesForDomainEventSubscriberOfT(Type type)
{
return type.GetInterfaces()
.Where(x => x.IsGenericType &&
x.GetGenericTypeDefinition() == typeof(DomainEventSubscriber<>))
.Select(x => x.GetGenericArguments()[0])
.ToArray();
}
请注意,这可能最终会返回类型参数。 例如,如果您有:
public class Foo<T> : DomainEventSubscriber<T>
然后它将返回T
,即Foo<T>
的类型参数。 如果您不想这样做,可以插入:
.Where(x => !x.IsGenericParameter)
在ToArray
调用之前。
(我还建议您按照.NET命名约定将接口重命名为I
前缀。)
我猜你在寻找Type.GetGenericTypeDefinition方法
private static void DisplayTypeInfo(Type t)
{
Console.WriteLine("\r\n{0}", t);
Console.WriteLine("\tIs this a generic type definition? {0}",
t.IsGenericTypeDefinition);
Console.WriteLine("\tIs it a generic type? {0}",
t.IsGenericType);
Type[] typeArguments = t.GetGenericArguments();
Console.WriteLine("\tList type arguments ({0}):", typeArguments.Length);
foreach (Type tParam in typeArguments)
{
Console.WriteLine("\t\t{0}", tParam);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.