Приведение объекта к System.Linq.Enumerable

1

У меня есть метод, который принимает объект, который делает копию этого объекта с помощью Json.Net для сериализации и десериализации этого объекта. Это выглядит так:

internal static object Clone(this object parameter)
{
    var type = parameter.GetType();
    var serializedObject = JsonConvert.SerializeObject(parameter);
    return JsonConvert.DeserializeObject(serializedObject, type);
}     

Проблема у меня в том, что у меня нет никакого контроля над тем, какие объекты передаются в это. И если кто-то например делает что-то вроде этого:

var result = myListOfStrings.Select(x => x);
result.Clone();

Объект, пройденный внутри, будет иметь тип WhereSelectListIterator'2

Я понимаю, что если бы я просто сделал

result.ToList().Clone();

Проблема будет решена. Однако настройка намного сложнее, чем описано здесь, и я просто не могу контролировать, что она передала в Clone. Таким образом, в моем методе Clone() я хотел бы проверить, является ли этот параметр каким-то перечислимым, и если это так, то "ToList()" на нем.

Какие-либо предложения?

  • 1
    Нужно ли поддерживать вызывающих абонентов, которые передают вам неклонируемые объекты? Похоже, что наиболее очевидным решением этой проблемы является просто не поддерживать конкретное использование вашего метода. Заставьте вызывающую программу выполнить преобразование во что-то сериализуемое, если они хотят начать с такого итератора.
  • 0
    Это из-за «ленивой казни». Попробуйте найти эту фразу.
Показать ещё 3 комментария
Теги:
linq

1 ответ

2

Возможно, это поможет вам реорганизовать ваш метод.

internal static object Clone(this object parameter)
{
    if (parameter is IEnumerable)
        parameter = (parameter as IEnumerable).Cast<object>().ToList();

    var serializedObject = JsonConvert.SerializeObject(parameter);
    return JsonConvert.DeserializeObject(serializedObject, parameter.GetType());
}
  • 1
    Cast<IEnumerable>() выглядит подозрительно для меня. Вы имеете в виду Cast<object>() ?
  • 0
    Работает! Я пытался сделать параметр.IsAssignableFrom (typeof (IEnumerable)), который не работал. Это сделал, хотя :) Спасибо!
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню