Прикрепить анонимный тип к объекту; как получить это? - PullRequest
2 голосов
/ 12 мая 2011

Я играю с классом .NET BackgroundWorker. В рамках его функциональности вы можете вызвать метод с именем ReportProgress, который позволяет передавать процент выполнения вашей фоновой задачи вместе с необязательным пользовательским параметром.

В конечном итоге ReportProgress вызывает обработчик события, и необязательный пользовательский параметр становится членом «UserState» аргумента события.

Вот краткий пример на случай, если мне неясно:

BackgroundProcess.ReportProgress(100, new{title="complete"});
/*****later on, this method is called******/
private void myEventHandler(object sender, RunWorkerCompletedEventArgs e)
{
   //e.UserState is my anonymous type defined in the call to ReportProgress(...)
}

Мой вопрос: как мне получить доступ к значению title в моем анонимном типе? Я предполагаю, что мне нужно использовать отражение, но пока мне не везет.

Ответы [ 3 ]

4 голосов
/ 12 мая 2011

Если вы используете C # 4.0:

dynamic o = e.UserState;
o.title;

Вы можете использовать отражение, но оно будет большим, медленным и безобразным. Именованный тип был бы более разумным.

3 голосов
/ 12 мая 2011

Не используйте анонимные объекты. Они относятся только к текущему методу. Как только вы покидаете область действия текущего метода, в котором они определены, доступ к ним становится PITA. Итак, определите простой класс, а затем приведите к этому классу:

BackgroundProcess.ReportProgress(100, new MyClass { Title = "complete" });

и затем:

private void myEventHandler(object sender, RunWorkerCompletedEventArgs e)
{
   var title = ((MyClass)e.UserState).Title;
}
1 голос
/ 12 мая 2011

Вы не можете, и нет никаких причин, по которым вам не следует создавать класс для передачи значений.

По возможности приводит к dynamic, а затем получает собственность, но Я не рекомендую .

...