2010-04-15 3 views
7

Beachten Sie Folgendes:Wie reflektieren Sie ein Attribut, das auf einen Rückgabewert angewendet wird?

[AttributeUsage(AttributeTargets.Parameter | AttributeTargets.ReturnValue)] 
public class NotNullAttribute : Attribute 
{ 
} 

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

Wie using System.Reflection, würden Sie sehen, dass das NotNullAttribute Attribut hatte auf den Rückgabewert der Methode angewandt? Wenn Sie nicht können, was ist der Zweck hinter der Syntax [return:]?

Antwort

9

MethodInfo hat eine ReturnTypeCustomAttributes-Eigenschaft. Wenn Sie GetCustomAttributes() aufrufen, erhalten Sie den Rückgabewert atributes.

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

Gah. Ihre Antwort hat mir gezeigt, dass PostSharp MethodBase verwendet und deshalb nicht verfügbar war. Vielen Dank. – Amy

+2

BTW, wenn Sie Assemblys in einen READ-ONLY-Kontext laden (was ich trotz meines vereinfachten Testfalls oben nicht getan habe), wird diese Lösung tatsächlich nicht funktionieren. Stattdessen müssen Sie Folgendes verwenden: CustomAttributeData.GetCustomAttribute (methodInfo.ReturnParameter) –

+3

Es gibt auch 'mi.ReturnParameter.GetCustomAttributes' etc. @Amy, der Grund, warum sie nicht auf' MethodBase' verfügbar sind, scheint zu sein, dass Konstruktoren nicht zulassen Rückgabetypen, während "Nicht-Konstruktormethoden" dies tun (sie sind C# -Methoden, C# -Accessoren für Eigenschaften/Indexer/Ereignisse, C# -Operatoren). Methoden, die "void" zurückgeben, können auch benutzerdefinierte Attribute auf ihren Rückgabewerten haben! –

Verwandte Themen