从提供的类型返回泛型接口实现的类型
本文关键字:类型 泛型接口 实现 返回 | 更新日期: 2023-09-27 18:13:03
给定一个实现接口的类:
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
呼叫前。
(我还建议您将接口重命名为具有I
前缀,遵循。net命名约定。)
我猜你正在寻找的类型。GetGenericTypeDefinition Method
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);
}
}