2010-10-07 1 views
1

Я смущен тем, как использовать общие методы для анализа общего списка в 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()); 
+0

Я не уверен, что вы просите ... Вы не можете использовать тот тип, который у вас есть на другой стороне. вы можете объявить аналогичный тип на клиенте и использовать его. – akonsu

+0

Итак, вы говорите, что невозможно преобразовать список, возвращенный с моей службы, с типом cusotmers? Можете ли вы сказать мне, есть ли другой способ сделать это, имея в виду, что я не могу изменить услугу. –

+0

Я бы создал подобный тип на клиенте и использовал его. – akonsu

ответ

0

Я был в состоянии решить эту проблему путем модификации самой службы WCF (хотя я не хотел делать это). Я изменил метод GetAllCustomers, чтобы возвращать datatable вместо родового типа. В самой службе, я уверен, преобразование общего типа в 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, и все работало как шарм.

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

 Смежные вопросы

  • Нет связанных вопросов^_^