2015-06-22 5 views
0

У меня есть набор классов, которые реализуют общий интерфейс и аннотируются атрибутом бизнес-домена. По замыслу, каждый класс имеет аннотацию с различной параметризациейПолучить объект по значению атрибута

[Foo(Bar=1)] 
public class EntityA : ICustomInterface 

[Foo(Bar=2)] 
public class EntityB : ICustomInterface 

[Foo(Bar=3)] 
public class EntityC : ICustomInterface 

Либо С весной IApplicationContext или используя обычное старое отражение, как мне найти класс, который реализует ICustomInterfaceи помечается [Foo(Bar=Y)]?

Что-то вроде Spring для Java getBeansWithAnnotation. Я не требую Spring.net, потому что эти объекты являются прототипами. Для того, чтобы быть ясно: если моя задача не требует использования Spring вообще я доволен, что

+1

Что относительно [этого] (http://stackoverflow.com/questions/26733/getting-all-types-that-implement-an-interface) и [this] (http://stackoverflow.com/questions/ 607178/как-Перечислите-все-классы-с-настраиваемого-класса-атрибута). Эти вопросы неоднократно задавались. –

+0

Не могли бы вы использовать [is] (https://msdn.microsoft.com/en-us/library/scekt9xw.aspx) для этого? – DGibbs

+0

@DGibbs спасибо, но оператор 'is' не применяется. У меня нет экземпляров классов в моем методе, я создам правильный класс на основе значения атрибута. –

ответ

2

Если вы получили Ассамблею, вы можете просто перебирать тип и проверить для условий:

var matchingTypes = 
    from t in asm.GetTypes() 
    where !t.IsInterface && !t.IsAbstract 
    where typeof(ICustomInterface).IsAssignableFrom(t) 
    let foo = t.GetCustomAttribute<FooAttribute>() 
    where foo != null && foo.Bar == Y 
    select t; 

Я предполагаю, что вы хотите только классы, где Foo.Bar имеет значение Y.

Смежные вопросы