Список приведения <object>к IEnumerable <T>в общей задаче - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть общая задача, где я использую List<object> для добавления объектов типа, указанного в задаче.

Я хотел бы вернуть этот список, приведя его от list<object> к IEnumerable<T>в рамках задачи.Возможно ли это.

Ценю любую помощь!

public List<Object> Contactcollection { get; set; }

Task<IEnumerable<T>> GetAllEntityRecords<T>(string URI, string authorization) where T : new()
{

    JEnumerable<JToken> children = Raw.Children();
    Contactcollection = new List<object>();
    foreach (JToken child in children)
    {
        T _contact = new T();
        _contact = JsonConvert.DeserializeObject<T>(child.ToString());

        Contactcollection.Add(_contact);
    }

    return (IEnumerable<T>)Contactcollection;
}

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Вы можете сделать это довольно просто с помощью LINQ.Нет необходимости сохранять результаты в списке:

IEnumerable<T> GetAllEntityRecords<T>(string URI, string authorization)
{
  return Raw.Children().Select(child => JsonConvert.DeserializeObject<T>(child.ToString());
}

Но если по какой-то причине вы предпочитаете хранить их в списке, вы можете добавить .ToList() в конец этого выражения.

0 голосов
/ 26 сентября 2018

Вы можете использовать расширение OfType<T> LINQ для фильтрации коллекции только для экземпляров T.

Contactcollection.OfType<T>();

Однако вместо List<object> вы можете просто использовать List<T> в этом случае.и избегайте всех приведений :-).

Task<IEnumerable<T>> GetAllEntityRecords<T>(string URI, string authorization) where T : new()
{

    JEnumerable<JToken> children = Raw.Children();
    var results = new List<T>();
    foreach (JToken child in children)
    {            
        var result = JsonConvert.DeserializeObject<T>(child.ToString());

        results.Add(result);
    }
    Contactcollection = new List<object>(results.OfType<object>());
    return results;
}

Однако вопрос в том, почему ваше свойство Contactcollection имеет тип List<object>.Если вы знаете, что он будет содержать контакты, почему бы не использовать явную типизацию вместо шаблонов?А если это не так, было бы лучше назвать его по-другому, а затем просто назначить его в конце метода, если вам нужно сохранить его, как я продемонстрировал в конце моего примера.

Наконец, обратите вниманиечто вам не нужно создавать new экземпляр T перед десериализацией.JsonConvert автоматически создаст экземпляр типа.

...