2013-02-21 4 views
3

저는 문서 생성기를 만들고 있습니다. MSDN 설명서는 적용될 때 특성에 전달 된 매개 변수를 보여줍니다. 예 : [ComVisibleAttribute(true)]. 리플렉션, pdb 파일 또는 기타 방법을 통해 이러한 매개 변수 값 및/또는 생성자를 C# 코드에서 호출하는 방법은 무엇입니까?속성 생성자에 전달 된 매개 변수는 어떻게 얻습니까?

: 내가 지금처럼 내 문서에 메소드의 서명을 보여줄 수 있기를 원하는

/// <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 인 경우 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 
    } 
} 

다른 속성은 비슷한 디자인 패턴을 따릅니다.


편집이 나는 약 Mono.Cecil 매우 비슷한 작업을 수행하는 방법에 대해 설명하는 this article을 발견했다. 이것은 당신이 필요로하는 것을해야한다고 본다.

foreach (CustomAttribute eca in classType.CustomAttributes) 
{ 
    Console.WriteLine("[{0}({1})]", eca, eca.ConstructorParameters.Join(", ")); 
} 
관련 문제