2009-03-20 4 views
0

Давайте предположим, что у меня есть следующий делегат:Используйте отражение, чтобы найти имя поля делегата

public delegate void Example(); 

и класс, такие как следующее:

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

Как я могу использовать отражение для получить имя «FailedTest»?

До сих пор я пытался:

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" 
} 

Пошаговое в отладчике, я не могу найти путь к имени заявленной области, «FailingTest».

Сохраняется ли эта информация во время выполнения или потеряна, когда назначен анонимный делегат?

ответ

3

BindingFlags вы идете в GetFields? Я использовал их:

BindingFlags.NonPublic | BindingFlags.Instance 

и я смог увидеть название поля.

+0

Я получил те же результаты, используя VS2008SP1. – Andy

+0

Это сработало для меня; каким-то образом я пропустил BindingFlags.Instance и пытался получить эту информацию от Type, затем прочитал значение анонимного метода; использование экземпляра делало трюк. Благодаря! –

Смежные вопросы