2009-10-23 10 views
6

継承されたものを無視する型でインターフェイスが直接実装される時を知るにはどうすればよいですか?

class Some : SomeBase, ISome {} 
class SomeBase : ISomeBase {} 
interface ISome{} 
interface ISomeBase{} 

typeof(Some).GetInterfaces()がISomeとISomeBaseを返して配列するので、私はインターフェイスを実装しているクラスを拡張しています。 ISomeが実装されているか継承されているかをISomeBaseとして区別できません。 MSDNとして、私は配列のインターフェイスの順序を仮定することはできませんので、私は失われています。メソッドtypeof(Some).GetInterfaceMap()はそれらを区別しません。

+1

なぜあなたは気にしていますか?あなたは何をしようとしているのですか? –

+1

説明は分かりませんが、サービスを拡張することができるので、インタフェース実装に基づいてAutoFacにサービスを自動的に登録したいのですが、私はその区別が必要です。 –

答えて

8

あなただけの基本型で実装されるインタフェースを除外する必要があります。

public static class TypeExtensions 
{ 
    public static IEnumerable<Type> GetInterfaces(this Type type, bool includeInherited) 
    { 
     if (includeInherited || type.BaseType == null) 
      return type.GetInterfaces(); 
     else 
      return type.GetInterfaces().Except(type.BaseType.GetInterfaces()); 
    } 
} 

... 


foreach(Type ifc in typeof(Some).GetInterfaces(false)) 
{ 
    Console.WriteLine(ifc); 
} 
関連する問題