2008-11-21 3 views

ответ

11

Используйте Assembly.GetTypes(), чтобы получить все типы, и Type.IsAssignableFrom() для проверки наследования. Дайте мне знать, нужен ли вам код, а также используете ли вы .NET 3.5. (Многие задачи для отражения, подобные этому, проще с LINQ to Objects.)

EDIT: В соответствии с запросом, вот пример: он находит все в mscorlib, который реализует IEnumerable. Обратите внимание, что жизнь несколько сложнее, когда базовый тип является общим ...

using System; 
using System.Collections; 
using System.Linq; 
using System.Reflection; 

class Test 
{ 
    static void Main() 
    { 
     Assembly assembly = typeof(string).Assembly; 
     Type target = typeof(IEnumerable);   
     var types = assembly.GetTypes() 
          .Where(type => target.IsAssignableFrom(type)); 

     foreach (Type type in types) 
     { 
      Console.WriteLine(type.Name); 
     } 
    } 
} 
+0

Джон Скит везде! хаха спасибо. – 2008-11-21 15:17:43

+0

Мне бы очень хотелось увидеть этот код, так как я не могу заставить Type.IsAssignableFrom() работать так, как я его понимаю. Я на 3.5 sp1. Благодаря! – 2009-02-05 00:42:24

1
var a = Assembly.Load("My.Assembly"); 
foreach (var t in a.GetTypes().Where(t => t is IMyInterface)) 
{ 
    // there you have it 
} 
0

Или для подклассов базового класса:

var a = Assembly.Load("My.Assembly"); 
foreach (var t in a.GetTypes().Where(t => t.IsSubClassOf(typeof(MyType))) 
{ 
    // there you have it 
} 
Смежные вопросы