Spowoduje to wyświetlenie wszystkich typów dziedziczących ogólną klasę podstawową. Nie wszystkie typy dziedziczące interfejs ogólny.
var AllTypesOfIRepository = from x in Assembly.GetAssembly(typeof(AnyTypeInTargetAssembly)).GetTypes()
let y = x.BaseType
where !x.IsAbstract && !x.IsInterface &&
y != null && y.IsGenericType &&
y.GetGenericTypeDefinition() == typeof(IRepository<>)
select x;
ten powróci wszystkich typów, w tym interfejsy, streszczeń i konkretnych typów, które mają otwartą typu rodzajowego w łańcuchu dziedziczenia.
public static IEnumerable<Type> GetAllTypesImplementingOpenGenericType(Type openGenericType, Assembly assembly)
{
return from x in assembly.GetTypes()
from z in x.GetInterfaces()
let y = x.BaseType
where
(y != null && y.IsGenericType &&
openGenericType.IsAssignableFrom(y.GetGenericTypeDefinition())) ||
(z.IsGenericType &&
openGenericType.IsAssignableFrom(z.GetGenericTypeDefinition()))
select x;
}
Ta druga metoda znajdzie ConcreteUserRepo i IUserRepository w tym przykładzie:
public interface ConcreteUserRepo : IUserRepository
{}
public interface IUserRepository : IRepository<User>
{}
public interface IRepository<User>
{}
public class User
{}
Tak, ale dostaniesz tylko concreterepo i irepo, gdy znajduje się on w tym samym zespole. Ale to jest absolutnie w porządku. – Rookian
Dobry połów! Musimy uważać, aby załadować wszystkie zależne złożenia, a nie tylko przeskanować aktualnie załadowane. Oto SO na temat ładowania wszystkich zespołów: http://stackoverflow.com/questions/2384592/c-net-is-there-a-way-to-force-all- referenced- assemblies-to-be-loaded-into- –
Typ (IRepository <>) działa tylko wtedy, gdy typ ogólny ma pojedynczy parametr ogólny. Wszelkie pomysły na typy, które mają więcej niż jeden rodzajowy parametr? – dotnetguy