2010-04-15 8 views
7

Si consideri il seguente:Come si riflette su un attributo applicato a un valore restituito?

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

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

Come, using System.Reflection, si vedrebbe che l'attributo NotNullAttribute era stata applicata al valore di ritorno del metodo? Se non ci riesci, qual è lo scopo alla base della sintassi [return:]?

risposta

9

MethodInfo ha una proprietà ReturnTypeCustomAttributes, se si chiama GetCustomAttributes() su questo si ottiene il valore di ritorno atrtibutes.

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

Gah. La tua risposta mi ha fatto capire che PostSharp usa MethodBase, ed è per questo che non era disponibile. Grazie. – Amy

+2

BTW, se si caricano gli assembly in un contesto di sola lettura (cosa che, nonostante il mio caso di test semplificato non lo ha fatto in precedenza), questa soluzione in realtà non funzionerà. Invece, devi usare: CustomAttributeData.GetCustomAttribute (methodInfo.ReturnParameter) –

+3

C'è anche 'mi.ReturnParameter.GetCustomAttributes' ecc. @Amy, Il motivo per cui non sono disponibili su' MethodBase' sembra essere che i costruttori non permettono restituisce i tipi, mentre i "metodi non di costruzione" fanno (sono metodi C#, accessori C# per proprietà/indicizzatori/eventi, operatori C#). I metodi che restituiscono 'void' possono anche avere attributi personalizzati sui loro valori di ritorno! –

Problemi correlati