Использование анонимных типов в местах, где вы не можете использовать вывод типов, невозможно, поэтому вы не можете, например, объявить поле класса или свойство анонимного типа.Однако неочевидным было использование логического вывода типа, который позволяет обмениваться анонимными объектами между методами.
Как я уже упоминал в своем комментарии, самый простой вариант - просто использовать именованный тип;это позволит вам определить ObservableCollection<>
как переменную уровня класса или типизировать ваш DataContext
в другом месте вашего класса.
В зависимости от того, как часто вам нужно использовать этот код, есть второй вариантэто включает в себя тип 100 * для вашего анонимного типа.Для этого вам необходимо знать, в каждом месте, где вы хотите использовать свой анонимный тип, какие поля имеют , в каком порядке .Также требуется, чтобы каждое использование анонимного типа существовало в одной и той же сборке - это гарантирует, что компилятор объединяет анонимные типы в один базовый тип.
Если это соответствует вашим требованиям, вы можете использовать такой «трюк», как этот:
ObservableCollection<T> Cast<T>(object obj, T typedobj)
{
return (ObservableCollection<T>)obj;
}
private void btnClockIn_Click(object sender, RoutedEventArgs e)
{
var temp = new
{
firstName = string.Empty,
lastName = string.Empty,
position = string.Empty,
clockInDate = DateTime.Min,
clockOutDate = DateTime.Now
};
var collection = Cast(lstView1.DataContext, temp);
collection.Add(...);
}
Позвольте мне повторить, это несколько грязный «трюк», который использует неясную деталь того, как C # реализует анонимные типы.,Это не "взлом" как таковой, поскольку поведение гарантируется спецификацией, но есть серьезные ограничения на то, как далеко это работает.Если у вас есть только одна или две такие коллекции, я бы определенно хотел дать имена вашим типам.