2013-04-07 2 views
1

Я хочу, чтобы получить PropertyValue из CustomAtrribute от всех класса, как струныПолучить CustomAttributeValue свойства Value As String Массив

Вот мой пользовательский атрибут наследуется от ExportAttribute

[JIMSExport("StockGroup","Stock")] 

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

Теперь я хочу, чтобы получить словарь

Dictionary<string, List<string>> moduleDict 

со всеми MODULENAME (второй параметр) и ContractName (первый параметр), Там могут быть классы с таким же модулем имя, поэтому мне нужен список имя контракта с что Имя модуля

Я могу получить все атрибуты JIMSExport с помощью отражения, но не удалось создать словарь

var exported = GetTypesWith<JIMSExportAttribute>(false).Select(x => x.GetCustomAttributes(true).First()); 

есть ли лучший способ о е это делать с помощью Caliburn Micro

ответ

2

может быть, вы ищете что-то вроде этого:

namespace AttributePlayground 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var moduleDict = makeModuleDict(); 
     } 

     public static Dictionary<string, List<string>> makeModuleDict() 
     { 
      var attribs = AppDomain.CurrentDomain 
       .GetAssemblies() 
       .SelectMany(
        x => x.GetTypes() 
         .SelectMany(
          y => y.GetCustomAttributes(typeof(JIMSExport), false) 
         ) 
       ) 
       .OfType<JIMSExport>(); 

      return attribs 
       .GroupBy(x => x.Module) 
       .ToDictionary(
        x => x.Key, 
        x => new List<String>(
         x.Select(y => y.ContractName) 
         ) 
        ); 

     } 

    } 

    [JIMSExport("Module1", "Contract1")] 
    public class TestClass1 
    { 

    } 

    [JIMSExport("Module1", "Contract2")] 
    public class TestClass2 
    { 

    } 

    [JIMSExport("Module2", "Contract3")] 
    public class TestClass3 
    { 

    } 

    [JIMSExport("Module2", "Contract4")] 
    public class TestClass4 
    { 

    } 

    [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = true)] 
    sealed class JIMSExport : Attribute 
    { 
     public readonly string ContractName; 
     public readonly string Module; 
     public JIMSExport(string Module,string ContractName) 
     { 
      this.Module = Module; 
      this.ContractName = ContractName; 
     } 

    } 
} 
+0

Большое спасибо, это сработало. Хотя я смог достичь этого, используя foreach петли. Но это решение выглядит лучше. –

+0

Не возможно ли это прямо через Caliburn.Micro –

+0

Я никогда не слышал о Caliburn.Micro: P – DarkSquirrel42

0

нужно использовать SelectMany и GroupBy

// allTypesWithReqdAttributes should contain list of types with JIMSExportAttribute 
IEnumerable<object> attributeList = allTypesWithReqdAttribute.SelectMany(x => x.GetCustomAttributes(true)); 
var myAttributeList = attributeList.OfType<JIMSExportAttribute>(); 
// assumes JIMSExportAttribute has ModuleName and ContractName properties 
var groups = myAttributeList.GroupBy(x => x.ModuleName, x => x.ContractName); 
var result = groups.ToDictionary(x => x.Key, x => new List<string>(x)); 
foreach (var group in groups) 
{ 
    Console.WriteLine("module name: " + group.Key); 
    foreach (var item in group) 
    { 
     Console.WriteLine("contract name: " + item); 
    } 
} 
+0

, упрощенная с использованием OfType, используемого DarkSquirrel42 answer – Sushil

0

Во-первых, позвольте мне сказать, что я не знаком с Caliburn Микро. Таким образом, существует небольшая вероятность того, что нормальное использование MEF может не применяться.

Что вы хотите, может быть достигнуто с помощью MEF Export Metadata. Объедините свой собственный ExportAttribute (JIMSExport) с метаданными экспорта и измените импорт, чтобы включить метаданные. Изучите раздел «Использование атрибута пользовательского экспорта» в предыдущей ссылке.

Обратите внимание, что вы не должны возвращаться к использованию отражения на загруженных сборках. Это может привести к ошибкам, так как отражение найдет все типы с указанным атрибутом, а то, что вы действительно хотите, - это типы, которые могут быть правильно экспортированы. Вам нужны типы, которые могут использоваться контейнером композиции.