繁体   English   中英

从提供的类型返回通用接口实现的类型

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM