Я пытаюсь получить некоторый опыт работы с дженериками, создав сериализатор.
У меня есть метод десериализации, с которым я бы хотел использовать дженерики. Он должен быть способен принимать объекты или IEnumerable
, например List<Person>
, Person[]
, et c. Deserialize<TResult>
работает .. вроде ... но я натолкнулся на блок, пытаясь понять, как на самом деле вернуть мой результат как TResult
.
Вот что у меня есть:
public static TResult Deserialize<TResult>(StreamReader inputStream)
{
if (inputStream.EndOfStream) return default(TResult);
if (typeof(TResult).IsEnumerable())
{
Type itemType = typeof(TResult).GetItemType();
IList list = (IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(itemType));
MethodInfo deserializeMethod =
typeof(SimpleFixedWidthSerializer)
.GetMethod("Deserialize", new[] { typeof(StreamReader) })
.MakeGenericMethod(new[] { itemType });
object item = null;
do
{
item = deserializeMethod.Invoke(null, new[] { inputStream });
if (item != null)
list.Add(item);
} while (item != null);
list.Dump();
return (TResult)list;
}
...
}
Глядя на Dump()
результата, я вижу, что он был правильно десериализован в System.Collection.Generic.List
типа Person
, и каждый Person
был индивидуально десерилизован должным образом ... но я не могу Кажется, выяснить, как добраться от IList
до моего TResult
. Пример вызова метода:
string testInput = "...";
using (MemoryStream mStream = new MemoryStream(Encoding.UTF8.GetBytes(testInput)))
using (StreamReader sr = new StreamReader(mStream))
SimpleFixedWidthSerializer.Deserialize<Person[]>(sr).Dump();
Что приводит к
Unable to cast object of type 'System.Collections.Generic.List 1[UserQuery+Person]' to type 'Person[]'
Кто-нибудь знает, как я могу конвертировать мои IList
правильно к моему TResult
?