Доступ к свойствам элементов, содержащихся в 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, у которого нет этих свойств.

Другие вопросы по тегам