2013-04-23 6 views
0

Я вызываю веб-сервис, который возвращает массив из одного из четырех пользовательских классов. Все классы имеют одинаковое внутреннее содержимое - одну строку с именем Описание и другую строку с именем Value. Я пытаюсь написать один метод, который может принять любой из четырех классов, и поместить его содержимое в источник данных выпадающего списка.Преобразование из одного класса в другой

Есть ли способ конвертировать из неизвестного составного класса в указанный класс с тем же содержимым? Или вырезать содержимое?

Или мне нужно написать четыре идентичные функции с различными типами данных?

редактировать: добавлен код

myDropDown.DataSource = CreateDataSource(myWebServiceResponse.Items); 
    myDropDown.DataTextField = "DescriptionField"; 
    myDropDown.DataValueField = "ValueField"; 

    // Bind the data to the control. 
    myDropDown.DataBind(); 

...

public ICollection CreateDataSource(MasterData[] colData) 
    { 
     // Create a table to store data for the DropDownList control. 
     DataTable dt = new DataTable(); 

     // Define the columns of the table. 
     dt.Columns.Add(new DataColumn("DescriptionField", typeof(String))); 
     dt.Columns.Add(new DataColumn("ValueField", typeof(String))); 

     // Populate the table 
     foreach (sapMasterData objItem in colData) 
     { 
      dt.Rows.Add(CreateRow(objItem, dt)); 
     } 

     // Create a DataView from the DataTable to act as the data source 
     // for the DropDownList control. 
     DataView dv = new DataView(dt); 
     return dv; 
    } 

    DataRow CreateRow(MasterData objDataItem, DataTable dt) 
    { 
     // Create a DataRow using the DataTable defined in the 
     // CreateDataSource method. 
     DataRow dr = dt.NewRow(); 

     dr[0] = objDataItem.Description; 
     dr[1] = objDataItem.Value; 

     return dr; 
    } 

public class MasterData 
{ 
    public string Value; 
    public string Description; 
} 
+1

Это будет полезно, если вы предоставляете некоторый код s. –

+0

Вы можете использовать 'dynamic'. –

+0

Вы можете поместить интерфейс во все классы и работать с ним. Или вы можете использовать AutoMapper – Brian

ответ

3

На самом деле управление DropDownList требует вам IEnumerable, как DataSource, а затем вы можете указать DataTextField и DataValueField:

dropDownList.DataSource = some_Array_You_Retrieved_From_Your_Web_Service; 
dropDownList.DataValueField = "Value"; 
dropDownList.DataTextField = "Description"; 
dropDownList.DataBind(); 

Как вы можете видеть, это не имеет значения для фактического типа массива, если у него есть Value и Description свойства для привязки его к.

+0

Так просто! Спасибо! – Adeptus

0

Вы можете определить интерфейс, что реализуется с помощью всех четырех классов (например, IDescriptionValue) и написать метод, который принимает параметр этого типа, например:

public interface IDescriptionValue 
{ 
public string Description {get;set;} 
public string Value {get;set;} 
} 

public class CustomClass1 : IDescriptionValue{ 
public string Description {get;set;} 
public string Value {get;set;} 
} 
//snip... 
public class CustomClass4 : IDescriptionValue{ 
public string Description {get;set;} 
public string Value {get;set;} 
} 
//accepts parameters of type IDescriptionValue 
public void setDropdownData(IDescriptionValue inputData){ 
// your code here 
} 
+0

Четыре класса определяются веб-службой (которая не была написана мной). Я не хочу изменять определения классов в случае, если мне нужно обновить ссылку на службу, потому что тогда я потеряю свои модификации. – Adeptus

1

обертка будет делать, у вас есть два подхода:

public class WSData 
{ 
    public string Value; 
    public string Description; 

    // First approach: single ctor with dynamic parameter 
    public WSData(dynamic source) 
    { 
     this.Value = source.Value; 
     this.Description = source.Description; 
    } 

    // ----- or -------- 

    // Second approach: one ctor for each class 
    public WSData(FirstTypeFromWS source) 
    { 
     this.Value = source.Value; 
     this.Description = source.Description; 
    } 
    public WSData(SecondTypeFromWS source) 
    { 
     this.Value = source.Value; 
     this.Description = source.Description; 
    } 
} 

использование тот же:

WSData yourData = new WSData(data_retrieved_from_service); 
// now, bind the WSData object: you have abstracted yourself from 
// the service and as a bonus your code can be attached elsewhere more easily 
Смежные вопросы