Я хотел бы найти все типы, наследующие базу/интерфейс. У кого-нибудь есть хороший способ сделать это? Идеи?Поиск сборки для всех типов детей?
Я знаю, что это странная просьба, но что-то, с чем я играю, не имеет никакого значения.
Я хотел бы найти все типы, наследующие базу/интерфейс. У кого-нибудь есть хороший способ сделать это? Идеи?Поиск сборки для всех типов детей?
Я знаю, что это странная просьба, но что-то, с чем я играю, не имеет никакого значения.
Используйте 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);
}
}
}
var a = Assembly.Load("My.Assembly");
foreach (var t in a.GetTypes().Where(t => t is IMyInterface))
{
// there you have it
}
Или для подклассов базового класса:
var a = Assembly.Load("My.Assembly");
foreach (var t in a.GetTypes().Where(t => t.IsSubClassOf(typeof(MyType)))
{
// there you have it
}
Джон Скит везде! хаха спасибо. – 2008-11-21 15:17:43
Мне бы очень хотелось увидеть этот код, так как я не могу заставить Type.IsAssignableFrom() работать так, как я его понимаю. Я на 3.5 sp1. Благодаря! – 2009-02-05 00:42:24