2013-08-23 74 views
0

我有我的WPF应用程序和Silverlight应用程序(Silverlight托管在我的WPF应用程序的Web浏览器控件中)之间的通信需求。C#可序列化动态对象

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

我已经看了一些轻量级的DataTable类实现(实例是here,但他们不是序列化。

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

回答

0

使用此类转换为数据表,

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> 
    { 
     // 
    } 
+0

这些类需要什么参考补充:VAR类型= ClassFactory.Instance.GetDynamicClass(this.Columns.Select(C =>新DynamicProperty(c.ColumnName,C。 DataType))); –

+0

以及我如何使它可序列化? –

+0

System.Linq.Dynamic.ClassFactory – Sajeetharan