Словарь метаданных MEF от объекта - PullRequest
2 голосов
/ 20 октября 2010

Я хотел бы вручную создать экспорт для композиции, но конструктор экспорта принимает словарь только для метаданных, в то время как я должен напрямую создавать его из объекта метаданных (IMyMetadata). Разве нет способа создать словарь из объекта? Примерно так:

IDictionary<string, object> metadata = AttributedModelServices.GetMetadataDictionary(metadata)

где метаданные - это объект IMyMetadata.

По сути, мне нужно использовать импортированный IEnumerable> для создания новых композиций, что-то вроде "пересылки" значений в другой CompositionBatch.

Спасибо

Ответы [ 3 ]

1 голос
/ 20 октября 2010

Разве нет способа создать словарь из объекта?

Конечно, вот так:

  public static IDictionary<string, object> GetPropertiesDictionary<T>(object o)
  {
     var dictionary = new Dictionary<string, object>();
     foreach (var property in typeof(T).GetProperties())
     {
        dictionary[property.Name] = property.GetValue(o,null);
     }
     return dictionary;
  }

По сути, моя потребностьэто использование импортированного IEnumerable для создания новых композиций, своего рода «пересылка» значений в другой CompositionBatch

Похоже, вы пытаетесь реализовать своего рода «ExportMany» особенность, которой нет (пока?) в MEF.(Он существует в некоторых других контейнерах IOC, таких как облегченные адаптеры в AutoFac ).Вы можете обойтись без такой функции.

Я собираюсь предположить, что у вас есть доступ к экспорту какого-либо типа (IStuff), но вам нужно обернуть их в адаптеры, чтобы вы могли импортировать ихкак-то еще (IAdaptedStuff).Возможно, вы могли бы придерживаться обычной атрибутивной модели программирования и сделать что-то вроде этого:

[Export(typeof(IAdaptedStuffUser))]
public class AdaptedStuffUser : IAdaptedStuffUser
{
   [Import] // instead of [ImportMany(typeof(IAdaptedStuff)))]
   public IAdaptedStuffProvider AdaptedStuffProvider { private get; set; }

   public void DoSomething()
   {
      foreach (var adaptedStuff in AdaptedStuffProvider.GetAdaptedStuff())
      {
         ...
      }
   }
}

[Export(typeof(IAdaptedStuffProvider))]
public AdaptedStuffProvider : IAdaptedStuffProvider
{
   [ImportMany]
   public IEnumerable<IStuff> StuffToAdapt { get; set; }

   public IEnumerable<IAdaptedStuff> GetAdaptedStuff()
   {
      return StuffToAdapt.Select(x => new Adapter(x));
   }
}
0 голосов
/ 29 октября 2010

Например:

[ImportMany]    
IEnumerable<IContract, IDictionary<string, object>> MyContracts { get; set; }
0 голосов
/ 20 октября 2010

Вы можете импортировать IEnumerable<IContract, IDictionary<string, object>>, чтобы получить словарь необработанных метаданных. Похоже, это будет работать для вас.

...