проблема при преобразовании универсального списка, поступающего из службы WCF, в таблицу данных - PullRequest
1 голос
/ 07 октября 2010

Я не совсем понимаю, как использовать универсальные методы для анализа универсального списка в datatable / dataset. Моя настройка: 1. У меня есть класс Customers, определенный в сервисной библиотеке 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. Использование службы WCF на странице веб-клиента. При нажатии кнопки я заполняю GridView списком, возвращаемым из GetAllCustomers (). Это прекрасно работает.

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;
}

Я не уверен, как вызвать эту функцию? Как я могу указать класс as Customers, который на самом деле находится в веб-сервисе? Полностью потерян. Буду признателен, если кто-нибудь может подсказать мне следующий код, как заставить его работать.

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

1 Ответ

0 голосов
/ 07 октября 2010

Мне удалось решить эту проблему, изменив саму Службу WCF (хотя я не хотел этого делать).Я изменил метод GetAllCustomers, чтобы он возвращал таблицу данных вместо универсального типа.В самой службе я конвертирую универсальный тип в datatable, используя те же методы:

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);

всегда будет возвращать нольдля моего типа.Это было связано с тем, что у меня не было методов get / set в классе Customers.Я создал методы get / set в классе Customer, и все работало как чудо.

Спасибо всем, кто помог и тем, кто пытался помочь:)

...