У меня есть различные объекты, которые реализуют определенный интерфейс. В одном месте в моем коде я получаю весь экспорт интерфейсов и сохраняю фактическое имя класса в БД. Вот некоторые быстрый и грязный псевдо:Получение экспортированного интерфейса путем реализации имени класса
public interface ISomething { }
[Export(typeof(ISomething))]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class Something : ISomething { }
[Export(typeof(ISomething))]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class SomethingElse : ISomething { }
public class Handler {
[Import]
CompositionContainer _container;
[ImportMany]
IEnumerable<ISomething> _somethings;
public void SaveSomething() {
foreach(ISomething something in _somethings) {
string className = something.GetType().Fullname;
SaveToDatabase(className);
}
}
}
Это работает просто отлично, и я могу легко получить все реализации ISomething. Однако мне также нужно получить новый экземпляр определенного имени класса в более поздней точке.
Если я попробую _container.GetExportedValues<ISomething>
Я получаю как Something
, так и SomethingElse
. Если я попробую _container.GetExportedValue<ISomething>("SomethingElse")
, я получаю ошибку композиции, говорящую, что он не может найти экспорт, соответствующий этому ограничению.
Итак, как я могу получить новый экземпляр SomethingElse
, зная только название класса?
А, вы можете поместить требуемое название контракта в атрибут '[Export]' ... Умный. Есть ли способ автоматически поместить полное имя класса в название контракта? Я могу сделать 'typeof (Something) .FullName' в коде, но не в атрибуте. – GTHvidsten
@GTHvidsten, AFAIK, нет никакого способа сделать это. – dymanoid