2013-02-21 2 views
3

Я работаю над генератором документации. Документация MSDN показывает параметры, переданные атрибутам при их применении. Например, [ComVisibleAttribute(true)]. Как получить эти значения параметров и/или конструктор, вызванный в моем коде C# через отражение, файл pdb или иначе?Как получить параметры, переданные конструктору атрибута?

Для уточнения> Если кто-то документально метод, который имеет атрибут на нем, как так:

/// <summary> foo does bar </summary> 
[SomeCustomAttribute("a supplied value")] 
void Foo() { 
    DoBar(); 
} 

Я хочу, чтобы иметь возможность показать подписи метода в моей документации следующим образом:

Signature: 

[SomeCustomAttribute("a supplied value")] 
void Foo(); 
+0

Вы спрашиваете о кодировании своего атрибута, который принимает параметры, или вы хотите узнать через отражение способ создания чужого атрибута? – dasblinkenlight

+0

через отражение того, как был создан чужой атрибут –

+0

Хм, спасибо за разъяснение. Прошу прощения за непонимание вашего вопроса. Мой метод, очевидно, не дал бы этого. Вам, вероятно, придется осмотреть ИЛ, но я не уверен, как это сделать. –

ответ

5

Если у вас есть член, для которого вы хотите получить пользовательские атрибуты и аргументы конструктора, то вы можете использовать следующий код отражения:

MemberInfo member;  // <-- Get a member 

var customAttributes = member.GetCustomAttributesData(); 
foreach (var data in customAttributes) 
{ 
    // The type of the attribute, 
    // e.g. "SomeCustomAttribute" 
    Console.WriteLine(data.AttributeType); 

    foreach (var arg in data.ConstructorArguments) 
    { 
     // The type and value of the constructor arguments, 
     // e.g. "System.String a supplied value" 
     Console.WriteLine(arg.ArgumentType + " " + arg.Value); 
    } 
} 

Чтобы получить элемент, начните с получением тип. Существует два способа получить тип.

  1. Если у вас есть экземпляр obj, позвоните по телефону Type type = obj.GetType();.
  2. Если у вас есть имя типа MyType, do Type type = typeof(MyType);.

Тогда вы можете найти, например, конкретный метод. Посмотрите на reflection documentation для получения дополнительной информации.

MemberInfo member = typeof(MyType).GetMethod("Foo"); 
+0

Что относительно атрибутов уровня класса? Часть участника проста. Я не понял, как отражать параметры атрибутов уровня класса. – jwize

3

Для параметра ComVisibileAttribute параметр, переданный конструктору, становится собственностью Value.

[ComVisibleAttribute(true)] 
public class MyClass { ... } 

... 

Type classType = typeof(MyClass); 
object[] attrs = classType.GetCustomAttributes(true); 
foreach (object attr in attrs) 
{ 
    ComVisibleAttribute comVisible = attr as ComVisibleAttribute; 
    if (comVisible != null) 
    { 
     return comVisible.Value // returns true 
    } 
} 

Другие атрибуты будут соответствовать аналогичному шаблону проектирования.


EDIT

Я нашел this article о Mono.Cecil, который описывает, как сделать что-то очень похожее. Похоже, он должен делать то, что вам нужно.

foreach (CustomAttribute eca in classType.CustomAttributes) 
{ 
    Console.WriteLine("[{0}({1})]", eca, eca.ConstructorParameters.Join(", ")); 
} 
Смежные вопросы