2011-11-15 8 views
4

以下のコードで定義されているインターフェイスを実装するクラスのオブジェクト型を返そうとしています。インターフェイスから 'IsAssignableFrom'を呼び出すと、具象クラスが返されない

LINQ文は唯一のインタフェース自体を返し、そのコンソール出力はちょうどです:

AssignableExperiment.IRule

はなぜ具体的なクラスが返却されていませんか?

using System; 
using System.Linq; 

namespace AssignableExperiment 
{ 
    public interface IRule 
    { 
     void Validate(string s); 
    } 

    public class ConcreteRule : IRule 
    { 
     public void Validate(string s) 
     { 
      // some logic 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      var ruleType = typeof(IRule); 

      var ruleTypes = from t in ruleType.Assembly.GetTypes() 
          where t.IsAssignableFrom(ruleType) 
          select t; 

      foreach (var type in ruleTypes) 
      { 
       Console.WriteLine(type); 
      } 

      Console.ReadLine(); 
     } 
    } 
} 

答えて

7

あなたはIsAssignableFromMSDNのまわりでそれを有効にしてください。 IsAssignableFromは別の方法で正常に動作しますので、BaseType.IsAssignableFrom(DerviedType)がtrueを返します。

var ruleTypes = from t in ruleType.Assembly.GetTypes() 
          where ruleType.IsAssignableFrom(t) 
          select t; 

あなたが戻っIRuleを取得したくない場合:

var ruleTypes = from t in ruleType.Assembly.GetTypes() 
          where ruleType.IsAssignableFrom(t) && t != ruleType 
          select t; 
+0

私は私が愚かであることを知っていました。ありがとうございました! – Nick

5

私はIsAssignableFromを嫌い、それはそうnefariously書かれています。これは狡猾な誤った実行を防ぐ使用

public static bool IsTypeOf<T>(this Type type) 
{ 
    return typeof (T).IsAssignableFrom(type); 
} 

私は常に拡張をロールバックします。

次にあなたが書くことができる:

var ruleTypes = ruleType.Assembly.GetTypes().Where(t=> t.IsTypeOf<IRule>());

+0

今私のプロジェクトで必要なのは唯一の場所なので、ジェネリックヘルパーを残しておきます。ありがとうございました。 – Nick

+0

これは魅力的でした – User101

関連する問題