C#Serializable动态对象

时间:2013-08-23 10:05:23

标签: wpf silverlight dynamic

我需要在我的WPF应用程序和Silverlight应用程序之间进行通信(Silverlight托管在我的WPF应用程序中的Web浏览器控件中)。

基本上,我在WPF中有DataTable对象,并且需要Silverlight中的这些数据(列是动态的)。由于DataTable在silverlight中不可用,因此我无法直接序列化/反序列化此DataTable。

我查看了一些轻量级的DataTable类实现(示例为here,但它们不可序列化。

有人可以指导我,我可以选择序列化/反序列化动态数据吗?

1 个答案:

答案 0 :(得分:0)

使用此类转换为datatable,

  public class DataTable : IEnumerable
    {
         public DataTable(IEnumerable<Dictionary<string, object>> source)
        {
            if (source != null)
            {
                var firstItem = source.FirstOrDefault();

                if (firstItem != null)
                {
                    foreach (var key in firstItem)
                    {
                        Columns.Add(new DataColumn() { ColumnName = key.Key, DataType = key.Value.GetType() });
                    }

                    foreach (var item in source)
                    {
                        var row = new DataRow();

                        foreach (var key in item)
                        {
                            row[key.Key] = key.Value;
                        }
                        Rows.Add(row);
                    }
                }
            }
        }

        List<DataColumn> columns = null;
        public List<DataColumn> Columns
        {
            get
            {
                if (columns == null)
                {
                    columns = new List<DataColumn>();
                }

                return columns;
            }
        }

        List<DataRow> rows = null;
        public List<DataRow> Rows
        {
            get
            {
                if (rows == null)
                {
                    rows = new List<DataRow>();
                }

                return rows;
            }
        }

        public object NewRow()
        {
            if (queryable != null)
            {
                return Activator.CreateInstance(queryable.ElementType);
            }

            return null;
        }

        #region IEnumerable Members

        IQueryable queryable = null;
        public IEnumerator GetEnumerator()
        {
            if (queryable == null)
            {
                var type = ClassFactory.Instance.GetDynamicClass(this.Columns.Select(c => new DynamicProperty(c.ColumnName, c.DataType)));
                var propertyInfos = type.GetProperties().ToList();

                var list = (IList) Activator.CreateInstance(typeof(List<>).MakeGenericType(type));
                foreach (var row in this.Rows)
                {
                    var item = Activator.CreateInstance(type);
                    propertyInfos.ForEach(p => p.SetValue(item, row[p.Name], null));

                    list.Add(item);
                }

                queryable = list.AsQueryable();
            }

            return queryable.GetEnumerator();
        }

        #endregion

        public IList ToList()
        {
            var enumerator = GetEnumerator();
            var list = (IList) Activator.CreateInstance(typeof(List<>).MakeGenericType(queryable.ElementType));
            while (enumerator.MoveNext())
            {
                list.Add(enumerator.Current);
            }
            return list;
        }
    }

    public class DataColumn
    {
        public DataColumn()
        {
            DataType = typeof(object);
        }

        public Type DataType { get; set; }
        public string ColumnName { get; set; }
    }

    public class DataRow : Dictionary<string, object>
    {
        //
    }