Я смущен тем, как использовать общие методы для анализа общего списка в datatable/dataset. Моя настройка: 1. У меня есть класс Клиенты, определенные в Сервисной библиотеке WCF.проблема с преобразованием общего списка, поступающего из службы WCF в DataTable
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. Расходуйте службу WCF на странице веб-клиента. При нажатии кнопки я заполняю GridView списком, возвращенным из GetAllCustomers(). Это прекрасно работает.
GridView1.DataSource = client.GetAllCustomers();
GridView1.DataBind();
4. Теперь этот вопрос, по какой-то причине (вроде/функции пейджинга) Я хочу, чтобы фактически преобразовать возвращенный общий список в DataTable. Для этого у меня есть метод, который возвращает мне datatable, который я хочу привязать к 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;
}
Я не уверен, как назвать эту функцию? Как я могу указать класс as Customers, который фактически находится в веб-сервисе? Полностью потерян. Я был бы признателен, если кто-то может вести меня по следующему коду, как заставить его работать.
GridView1.DataSource = ConvertTo<???>(client.GetAllCustomers());
Я не уверен, что вы просите ... Вы не можете использовать тот тип, который у вас есть на другой стороне. вы можете объявить аналогичный тип на клиенте и использовать его. – akonsu
Итак, вы говорите, что невозможно преобразовать список, возвращенный с моей службы, с типом cusotmers? Можете ли вы сказать мне, есть ли другой способ сделать это, имея в виду, что я не могу изменить услугу. –
Я бы создал подобный тип на клиенте и использовал его. – akonsu