Доступ к свойствам элементов, содержащихся в IEnumerable
Извините, если название вводит в заблуждение, вы можете исправить, если у вас есть идея, что я пытаюсь сказать. У меня есть функция, которая принимает IEnumberable. IEnumerable является анонимным типом. Моя функция ниже
public void AddToCollection_Short(IEnumerable query)
{
List<object> list = new List<object>();
foreach (var item in query)
{
var obj = new object();
var date = item.Date.ToShortDateString();
obj = new { date, item.Id, item.Subject };
list.Add(obj);
}
AllQueries = list;
OnPropertyChanged("AllQueries");
}
Он не распознает такие суффиксы, как.Id,.Date,.Subject. Могу ли я спросить, какой подход я должен предпринять, чтобы исправить это. Есть ли что-то вроде IEnumerable<Datetime Date, int Id, string Subject>
запрос
3 ответа
Вы можете использовать (в C# 4.0 и выше) dynamic
введите ключевое слово или обновите подпись до AddToCollection_Short
,
public void AddToCollection_Short(IEnumerable query)
{
List<object> list = new List<object>();
foreach (dynamic item in query)
{
var obj = new object();
var date = item.Date.ToShortDateString();
obj = new { date, item.Id, item.Subject };
list.Add(obj);
}
AllQueries = list;
OnPropertyChanged("AllQueries");
}
Если вы знаете тип, вы можете разыграть свои объекты
foreach (var item in query.Cast<YourType>())
Если вы не знаете, тогда вы можете использовать динамическую функцию. И вы можете получить доступ к своим свойствам без ошибки времени компиляции, но если вы попытаетесь получить доступ к свойству или методу, который не существует, вы получите RuntimeBinderException
во время выполнения.
foreach (dynamic item in query)
{
...
}
Вы должны быть в состоянии указать параметр типа для вашего метода.
public void AddToCollection_Short<T>(IEnumerable<T> query) where T : IAmCommonInterface
{
List<object> list = new List<object>();
foreach (T item in query)
{
var obj = new object();
var date = item.Date.ToShortDateString();
obj = new { date, item.Id, item.Subject };
list.Add(obj);
}
AllQueries = list;
OnPropertyChanged("AllQueries");
}
и ваш общий интерфейс для вашего параметра типа будет иметь все свойства, которые вы хотите на нем. Преимущество этого заключается в том, что компилятор сообщит вам, когда вы попытаетесь использовать это для Enumerable, у которого нет этих свойств.