Wpf C#可序列化动态对象

Wpf C#可序列化动态对象,wpf,silverlight,dynamic,Wpf,Silverlight,Dynamic,我需要在WPF应用程序和Silverlight应用程序之间进行通信(Silverlight托管在WPF应用程序的Web浏览器控件中) 基本上,我在WPF中有DataTable对象,需要Silverlight中的数据(列是动态的)。由于DataTable在silverlight中不可用,因此我无法直接序列化/反序列化此DataTable 我已经研究了一些轻量级DataTable类实现(示例是,但它们不可序列化) 有人能告诉我,序列化/反序列化动态数据的选项是什么吗?使用此类转换为datatable

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

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

我已经研究了一些轻量级DataTable类实现(示例是,但它们不可序列化)


有人能告诉我,序列化/反序列化动态数据的选项是什么吗?

使用此类转换为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>
    {
        //
    }
公共类数据表:IEnumerable
{
公共数据表(IEnumerable源)
{
如果(源!=null)
{
var firstItem=source.FirstOrDefault();
if(firstItem!=null)
{
foreach(第一项中的变量键)
{
添加(新的DataColumn(){ColumnName=key.key,DataType=key.Value.GetType()});
}
foreach(源中的var项)
{
var row=新数据行();
foreach(var输入项)
{
行[key.key]=key.Value;
}
行。添加(行);
}
}
}
}
列表列=null;
公共列表列
{
得到
{
如果(列==null)
{
columns=新列表();
}
返回列;
}
}
列表行=null;
公共列表行
{
得到
{
if(行==null)
{
行=新列表();
}
返回行;
}
}
公共对象NewRow()
{
if(可查询!=null)
{
返回Activator.CreateInstance(queryable.ElementType);
}
返回null;
}
#区域可数成员
IQueryable queryable=null;
公共IEnumerator GetEnumerator()
{
if(queryable==null)
{
var type=ClassFactory.Instance.GetDynamicClass(this.Columns.Select(c=>newdynamicproperty(c.ColumnName,c.DataType));
var propertyInfos=type.GetProperties().ToList();
var list=(IList)Activator.CreateInstance(typeof(list).MakeGenericType(type));
foreach(此.Rows中的变量行)
{
var item=Activator.CreateInstance(类型);
propertyInfos.ForEach(p=>p.SetValue(项,行[p.Name],null));
列表。添加(项目);
}
queryable=list.AsQueryable();
}
返回queryable.GetEnumerator();
}
#端区
公共IList ToList()
{
var枚举器=GetEnumerator();
var list=(IList)Activator.CreateInstance(typeof(list).MakeGenericType(queryable.ElementType));
while(枚举数.MoveNext())
{
list.Add(枚举数.Current);
}
退货清单;
}
}
公共类数据列
{
公共数据列()
{
数据类型=类型(对象);
}
公共类型数据类型{get;set;}
公共字符串ColumnName{get;set;}
}
公共类数据行:字典
{
//
}

这些类在哪里?我需要添加什么引用:var type=ClassFactory.Instance.GetDynamicClass(this.Columns.Select(c=>newdynamicproperty(c.ColumnName,c.DataType));以及如何使其可序列化?System.Linq.Dynamic.ClassFactory