2013-05-11 82 views
0

通用接口實現的實現接口:返回類型從給定的類提供的類型

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 } 
} 

豈今請做好嗎?

+0

確保您的接口全部以「IDomain ...」開頭。這是編碼的禮貌方式。 – ja72 2013-05-11 14:31:52

回答

3

這聽起來像你想要的東西,如:

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命名約定。)

0

我猜你正在尋找Type.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); 
    } 
} 
+0

那麼,加上其他方法...... OP需要先找到類型實現的接口。 – 2013-05-11 13:44:51