2013-05-23 21 views
8

Ho le seguenti due metodi che mi chiedo se sono appropriate:La denominazione del metodo per getter/setter di proprietà è standardizzata in IL?

public bool IsGetter(MethodInfo method) 
{ 
    return method.IsSpecialName 
     && method.Name.StartsWith("get_", StringComparison.Ordinal); 
} 

public bool IsSetter(MethodInfo method) 
{ 
    return method.IsSpecialName 
     && method.Name.StartsWith("set_", StringComparison.Ordinal); 
} 

Anche se questo codice funziona, che sto sperando di evitare la parte che controlla la StartsWith e programmaticamente ottenere la convenzione di denominazione . Fondamentalmente, ci sono classi .NET 4.5 che sono in grado di vedere se MethodInfo è un getter/setter di proprietà?

+1

Mentre anche io eviterei le corde magiche, sono di fatto standardizzato. –

risposta

13

Metodo struttura dispone di tre caratteristiche in più, rispetto ad un metodo normale:

  1. Iniziano sempre con get_ o set_, mentre un metodo normale PU CAN iniziare con quei prefissi.
  2. La proprietà MethodInfo.IsSpecialName è impostata su true.
  3. MethodInfo ha un attributo personalizzato System.Runtime.CompilerServices.CompilerGeneratedAttribute.

È possibile verificare su 1, in combinazione con l'opzione 2 o 3. Poiché i prefissi sono uno standard, non dovresti preoccuparti di controllarlo.

L'altro metodo è quello di enumerare tutte le proprietà e abbinare i metodi, che sarà molto più lento:

public bool IsGetter(MethodInfo method) 
{ 
    if (!method.IsSpecialName) 
     return false; // Easy and fast way out. 
    return method.DeclaringType 
     .GetProperties(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic) 
     .Any(p => p.GetGetMethod() == method); 
} 
+0

Ottima risposta - I stava saltando per aggiungere qualcosa di simile, ma tu hai coperto. –

1

Si potrebbe provare la seguente:

public bool IsGetter(MethodInfo method) 
{ 
    return method.DeclaringType.GetProperties(). 
           Any(propInfo => propInfo.GetMethod == method); 
} 

È possibile specificare i flag vincolanti per GetProperties

+0

+1 (ed è '.GetGetMethod()' precedente a .NET 4.5.) –

+0

Ora controlla solo l'istanza e le proprietà pubbliche. –

+0

@ MartinMulder, mi dispiace, non ho capito il tuo commento? –

Problemi correlati