2009-03-20 9 views
0

Disons que je le délégué suivant:Utiliser la réflexion pour trouver le nom d'un champ délégué

public delegate void Example(); 

et une classe comme les suivants:

public class TestClass { 
    Example FailingTest =() => Assert.Equal(0,1); 
} 

Comment puis-je utiliser la réflexion pour obtenir le nom "FailingTest"?

Jusqu'à présent, j'ai essayé:

var possibleFields = typeof(TestClass).GetFields(relevant_binding_flags) 
          .Where(x => x.FieldType.Equals(typeof(Example))); 

foreach(FieldInfo oneField in possibleFields) { 
    // HERE I am able to access the declaring type name 
    var className = oneField.ReflectedType.Name; // == "TestClass" 

    // but I am not able to access the field 
    // name "FailingTest" because: 
    var fieldName = oneField.Name; // == "CS$<>9__CachedAnonymousMethodDelegate1" 
} 

Parcourant dans le débogueur, je ne peux pas trouver un chemin d'accès au nom du champ déclaré, « FailingTest ».

Cette information est-elle conservée lors de l'exécution ou est-elle perdue lors de l'attribution du délégué anonyme?

Répondre

3

De quel BindingFlags passez-vous à GetFields? J'ai utilisé ceux-ci:

BindingFlags.NonPublic | BindingFlags.Instance 

et j'étais capable de voir le nom du champ.

+0

J'ai obtenu les mêmes résultats, en utilisant VS2008SP1. – Andy

+0

Cela a fonctionné pour moi; d'une manière ou d'une autre j'ai manqué BindingFlags.Instance et j'essayais d'obtenir cette information du Type puis lu la valeur de la méthode anonyme de; en utilisant une instance a fait l'affaire. Merci! –