2011-11-15 59 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