2010-04-15 6 views
7

는 다음 사항을 고려하십시오 :반환 값에 적용된 특성을 어떻게 반영합니까?

당신이 NotNullAttribute 속성은 메서드의 반환 값에 적용되는지 볼 것이다 어떻게하는 System.Reflection을 사용하여,
[AttributeUsage(AttributeTargets.Parameter | AttributeTargets.ReturnValue)] 
public class NotNullAttribute : Attribute 
{ 
} 

public class Class1 
{ 
    [return: NotNull] 
    public static string TestMethod([NotNull] string arg) 
    { 
     return arg + " + " + arg; 
    } 
} 

? 할 수 없다면 [return :] 문법의 목적은 무엇입니까?

답변

9

MethodInfo에는 ReturnTypeCustomAttributes 속성이 있습니다.이 경우 GetCustomAttributes()를 호출하면 반환 값 atrtibutes가 반환됩니다.

MethodInfo mi = typeof(Class1).GetMethod("TestMethod"); 
object[] attrs = mi.ReturnTypeCustomAttributes.GetCustomAttributes(true); 
+0

가. 당신의 대답은 PostSharp가 MethodBase를 사용하고 있다는 것을 깨닫게했기 때문에 그것이 사용 가능하지 않은 이유입니다. 감사. – Amy

+2

BTW, 어셈블리를 읽기 전용 컨텍스트로로드하는 경우 (위의 단순화 된 테스트 케이스에도 불구하고 그렇다)이 솔루션은 실제로 작동하지 않습니다. 대신에, 다음을 사용해야합니다 : CustomAttributeData.GetCustomAttribute (methodInfo.ReturnParameter) –

+3

'mi.ReturnParameter.GetCustomAttributes' 등이 있습니다. @Amy,'MethodBase'에서 사용할 수없는 이유는 그 생성자가 허용하지 않는 것 같습니다 "비 생성자 메서드"는 C# 메서드, 속성/인덱서 ​​/ 이벤트의 C# 접근 자, C# 연산자입니다. 'void'를 리턴하는 메소드는 리턴 값에 커스텀 속성을 가질 수 있습니다! –