2013-05-23 9 views
8

mam następujące dwie metody, zastanawiam się, czy są one odpowiednio:Czy metoda nazywania właściwości getters/setters jest zestandaryzowana w 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); 
} 

Podczas gdy ten kod działa, mam nadzieję uniknąć część, która sprawdza startswith i programowo uzyskać konwencji nazewnictwa . Zasadniczo istnieją jakieś klasy .NET 4.5, które są w stanie sprawdzić, czy MethodInfo jest właściwość getter/setter?

+1

Chociaż ja też byłoby uniknąć magiczne ciągi, w rzeczywistości są one standaryzowane. –

Odpowiedz

13

Sposób Nieruchomość posiada trzy dodatkowe cechy, w porównaniu z normalną metodą:

  1. Zawsze zaczynają się od get_ lub set_, podczas gdy normalna metoda CAN zaczyna się od tych prefiksów.
  2. Właściwość MethodInfo.IsSpecialName jest ustawiona na true.
  3. Metoda MethodInfo ma niestandardowy atrybut System.Runtime.CompilerServices.CompilerGeneratedAttribute.

Możesz sprawdzić 1, w połączeniu z opcją 2 lub 3. Ponieważ przedrostki są standardem, nie powinieneś się martwić o ich sprawdzenie.

Drugą metodą jest wyliczyć przez wszystkich właściwości i dopasować metody, które będą znacznie wolniej:

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

Doskonała odpowiedź - I pojawiło się, by dodać coś podobnego, ale masz to pokryte. –

1

Można spróbować wykonać następujące czynności:

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

Opcjonalnie można określić wiążące flagi dla GetProperties

+0

+1 (i jest to '.GetGetMethod()' przed .NET 4.5.) –

+0

Teraz sprawdza tylko instancje i właściwości publiczne. –

+0

@MartinMulder, przepraszam, nie rozumiem twojego komentarza? –

Powiązane problemy