2012-03-29 24 views
4

タイプがインターフェイスのセットの1つを実装しているかどうかをテストします。C#:オブジェクトがインターフェイスのリストのいずれかを実装しているかどうかをテストしますか?

ViewData["IsInTheSet"] = 
      model.ImplementsAny<IInterface1, IInterface2, IInterface3, IInterface4>(); 

これを処理するために、以下の拡張メソッドを記述しました。

次のコードを書くために、より拡張性の高い方法がありますか?ジェネリックを活用しながら新しい方法を書く必要がない方がいいです

public static bool Implements<T>(this object obj) 
    { 
     Check.Argument.IsNotNull(obj, "obj"); 

     return (obj is T); 
    } 

    public static bool ImplementsAny<T>(this object obj) 
    { 
     return obj.Implements<T>(); 
    } 

    public static bool ImplementsAny<T,V>(this object obj) 
    { 
     if (Implements<T>(obj)) 
      return true; 
     if (Implements<V>(obj)) 
      return true; 
     return false; 
    } 

    public static bool ImplementsAny<T,V,W>(this object obj) 
    { 
     if (Implements<T>(obj)) 
      return true; 
     if (Implements<V>(obj)) 
      return true; 
     if (Implements<W>(obj)) 
      return true; 
     return false; 
    } 

    public static bool ImplementsAny<T, V, W, X>(this object obj) 
    { 
     if (Implements<T>(obj)) 
      return true; 
     if (Implements<V>(obj)) 
      return true; 
     if (Implements<W>(obj)) 
      return true; 
     if (Implements<X>(obj)) 
      return true; 
     return false; 
    } 
+0

これはおそらくhttp://s.tk/reviewのより良い質問です。 –

+1

'type'オブジェクトを' typeof(InterfaceN) 'で保存し、' obj.GetType() 'を使ってそのように関係を判断しますか? –

答えて

5

次のようなものは使用しない理由:インタフェースが実装されている場合、私がチェックする方法がある

model.ImplementsAny(typeof(IInterface1), 
        typeof(IInterface2), 
        typeof(IInterface3), 
        typeof(IInterface4)); 
+0

'Type.IsAssignableFrom'を使用して型がインタフェースを実装しているかどうかを判断するときは注意してください。 'obj'がジェネリッククラスである状況では動作しません。私はこれを難しい方法で見つけ出したので、私の答えのコードによって処理されました。 –

1

public static bool ImplementsAny(this object obj, params Type[] types) 
{ 
    foreach(var type in types) 
    { 
     if(type.IsAssignableFrom(obj.GetType()) 
      return true; 
    } 

    return false; 
} 

を次にあなたのようにそれを呼び出すことができます

public static bool IsImplementationOf(this Type checkMe, Type forMe) 
{ 
    if (forMe.IsGenericTypeDefinition) 
     return checkMe.GetInterfaces().Select(i => 
     { 
      if (i.IsGenericType) 
       return i.GetGenericTypeDefinition(); 

      return i; 
     }).Any(i => i == forMe); 

    return forMe.IsAssignableFrom(checkMe); 
} 

これは簡単にできますいっそ

public static bool IsImplementationOf(this Type checkMe, params Type[] forUs) 
{ 
    return forUs.Any(forMe => 
    { 
     if (forMe.IsGenericTypeDefinition) 
      return checkMe.GetInterfaces().Select(i => 
      { 
       if (i.IsGenericType) 
        return i.GetGenericTypeDefinition(); 

       return i; 
      }).Any(i => i == forMe); 

     return forMe.IsAssignableFrom(checkMe); 
    }); 
} 

または::まで延長

public static bool IsImplementationOf(this Type checkMe, params Type[] forUs) 
{ 
    return forUs.Any(forMe => checkMe.IsImplementationOf(forMe)); 
} 

警告:

未テストをそれからちょうどこのに渡す前に、あなたの型パラメータのtypeofを行います。

関連する問題