我很困惑如何使用泛型方法将通用列表解析为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());
答案 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方法,一切都像魅力一样。
感谢所有帮助过的人和那些试图提供帮助的人:)