ilistconverter.cs

来自「AJAX开发工具包」· CS 代码 · 共 81 行

CS
81
字号
using System;
using System.Reflection;
using System.Text;
using System.Collections;
using System.Collections.Specialized;

namespace AjaxPro
{
	/// <summary>
	/// Provides methods to serialize and deserialize an object that implements IList.
	/// </summary>
	/// <remarks>
	/// The .Add methods argument type is used to get the type for the list.
	/// </remarks>
	public class IListConverter : IJavaScriptConverter
	{
		public IListConverter() : base()
		{
		}

		public override object Deserialize(IJavaScriptObject o, Type t)
		{
			if(!typeof(IList).IsAssignableFrom(t) || !(o is JavaScriptArray))
				throw new NotSupportedException();

			JavaScriptArray a = (JavaScriptArray)o;
			IList list = (IList)Activator.CreateInstance(t);

			MethodInfo mi = t.GetMethod("Add");
			ParameterInfo pi = mi.GetParameters()[0];

			foreach(IJavaScriptObject i in a)
			{
				list.Add(JavaScriptDeserializer.Deserialize(i, pi.ParameterType));
			}

			return list;
		}

		public override string Serialize(object o)
		{
			if(!(o is IList))
				throw new NotSupportedException();

			StringBuilder sb = new StringBuilder();
			IEnumerable enumerable = (IEnumerable)o;
			bool b = true;

			sb.Append("[");
				
			foreach(object obj in enumerable)
			{
				if(b){ b = false; }
				else{ sb.Append(","); }

				sb.Append(JavaScriptSerializer.Serialize(obj));
			}

			sb.Append("]");

			return sb.ToString();
		}

		public override Type[] SerializableTypes
		{
			get
			{
				return new Type[]{typeof(IList)};
			}
		}

		public override Type[] DeserializableTypes
		{
			get
			{
				return new Type[]{typeof(IList)};
			}
		}
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?