将来自WCF服务的通用列表转换为DataTable时出现问题

时间:2010-10-07 13:30:48

标签: datatable wcf generic-list

我很困惑如何使用泛型方法将通用列表解析为datatable / dataset。我的设置: 1.我在WCF服务库中定义了一个客户类。

namespace Wcf.Sample.ServiceLibrary
{
    public class Customers
    {
        public string ID = string.Empty;
        public string CompanyName = string.Empty;
        public string ContactName = string.Empty;
    }
}

2。我使用这个类从我的OperationContract返回一个通用列表。

namespace Wcf.Sample.ServiceLibrary
{
    [ServiceContract]
    public interface ICustomerService
    {
        [OperationContract]
        List<Customers> GetAllCustomers();
    }       
}

3。在Web客户端页面中使用WCF服务。单击按钮,我使用从GetAllCustomers()返回的列表填充GridView。这完全没问题。

GridView1.DataSource = client.GetAllCustomers();
GridView1.DataBind();

4。现在的问题是,出于某种原因(排序/分页功能)我想实际将返回的通用列表转换为数据表。为此,我有一个方法,返回一个我想绑定到GridView的数据表。以下是方法:

public static DataTable ConvertTo<T>(System.Collections.Generic.List<T> genericList)
{
    //create DataTable Structure
    DataTable dataTable = CreateTable<T>();
    Type entType = typeof(T);
    PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(entType);
    //get the list item and add into the list
    foreach (T item in genericList)
    {
        DataRow row = dataTable.NewRow();
        foreach (PropertyDescriptor prop in properties)
        {
            row[prop.Name] = prop.GetValue(item);
        }
        dataTable.Rows.Add(row);
    }
    return dataTable;
}

public static DataTable CreateTable<T>()
{
    //T –> ClassName
    Type entType = typeof(T);
    //set the datatable name as class name
    DataTable dataTable = new DataTable(entType.Name);
    //get the property list
    PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(entType);
    foreach (PropertyDescriptor prop in properties)
    {
        //add property as column
        dataTable.Columns.Add(prop.Name, prop.PropertyType);
    }
    return dataTable;
}

我不确定如何调用此功能?如何指定实际位于Web服务中的Customers类?完全迷失了。如果有人可以指导我使用以下代码,如何使其工作,我将不胜感激。

GridView1.DataSource = ConvertTo<???>(client.GetAllCustomers());

1 个答案:

答案 0 :(得分:0)

我能够通过修改WCF服务本身来解决这个问题(虽然我不愿意这样做)。我修改了GetAllCustomers方法以返回数据表而不是泛型类型。在服务本身,我使用相同的方法将泛型类型转换为数据表:

public static DataTable ConvertTo<T>(System.Collections.Generic.List<T> genericList) 
{ 
    //create DataTable Structure 
    DataTable dataTable = CreateTable<T>(); 
    Type entType = typeof(T); 
    PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(entType); 
    //get the list item and add into the list 
    foreach (T item in genericList) 
    { 
        DataRow row = dataTable.NewRow(); 
        foreach (PropertyDescriptor prop in properties) 
        { 
            row[prop.Name] = prop.GetValue(item); 
        } 
        dataTable.Rows.Add(row); 
    } 
    return dataTable; 
} 

public static DataTable CreateTable<T>() 
{ 
    //T –> ClassName 
    Type entType = typeof(T); 
    //set the datatable name as class name 
    DataTable dataTable = new DataTable(entType.Name); 
    //get the property list 
    PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(entType); 
    foreach (PropertyDescriptor prop in properties) 
    { 
        //add property as column 
        dataTable.Columns.Add(prop.Name, prop.PropertyType); 
    } 
    return dataTable; 
}

我注意到的另一件事是以下一行

PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(entType);
对于我的类型,

总是返回null。这是因为我在Customers类中没有任何get / set方法。我在Customer类中创建了get / set方法,一切都像魅力一样。

感谢所有帮助过的人和那些试图提供帮助的人:)