У меня есть метод, который принимает объект, который делает копию этого объекта с помощью 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()" на нем.
Какие-либо предложения?
Возможно, это поможет вам реорганизовать ваш метод.
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());
}
Cast<IEnumerable>()
выглядит подозрительно для меня. Вы имеете в виду Cast<object>()
?