2012-10-01 85 views
-1
public class MyDataTable : DataTable 
{ 
    public string MyProperty { get; set; } 
    public DataTable MyData { get; set; } 

    public void MyMethod() 
    { 
     //...do some processing on itself 
     MyData = this; 
    } 
} 

我創建了這個繼承DataTable的MyDataTable類。關於繼承DataTable的問題

public class MyClass 
{ 
    public void ProcessData() 
    { 
     MyDataTable table = new MyDataTable(); 
     table.MyMethod(); 

     AcceptDataTable(table); //it won't accept the table parameter. 
     AcceptDataTable(table.MyData); //it still won't accept the table parameter. 
     AcceptDataTable((DataTable)table); //it still won't accept the table parameter. 
    } 

    public void AcceptDataTable(DataTable table) 
    { 
     Service1.SubmitData(table); //actually this is where it fails. It is a WCF Service's method that takes a DataTable as parameter. It works fine if I pass a DataTable, but not MyDataTable 
    //There was an error while trying to serialize parameter http://tempuri.org/:dt. The InnerException message was 'Type 'SubmitData' with data contract name MyDataTable 
    } 
} 
+6

列表中的錯誤消息。這應該工作。 –

+1

我編輯過你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

+3

我只是試過了,沒有錯誤 –

回答

-1

爲什麼要擴展DataTable?如果你正在尋找添加方法,你應該看看Extension Methods。我很確定DataTable Class沒有任何可以覆蓋的虛擬方法或屬性,並且在polymorphism中隱藏記憶不起作用。 Check out this post對另一個想要擴展DataTable的人的看法。

編輯:

如果您也想通過WCF來傳遞你的對象,必須註明Serializable,但這會導致其他一些時髦的問題,如果基類有某種特殊的也可能會被拒絕序列化。在這種情況下,將您的派生類標記爲[Serializable]將會拋出一個錯誤。

我會認真考慮你所描述的Factory Pattern。這樣你就可以讓你的工廠類每次構建你的表的方式,但它仍然是一個DataTable。

如果您的數據表中有任何對象(不是原始的),則必須將WCF服務標記爲具有「KnownTypes(typeof(MyType))」,以便它知道序列化數據表中有序列化的東西。

最後一個平局,你應該避免使用數據表和數據集在WCF ...

Returning DataSets from WebServices is the Spawn of Satan and Represents All That Is Truly Evil in the World

WCF Performance Using Datasets – Part 2

+2

這應該沒有什麼區別(除了不能調用MyMethod()')。 –

+0

@HenkHolterman:你說得對,我更傾向於「不要擴展DataTable」方法。編輯答案。 – iMortalitySX

+0

我更新了我的問題。實際上,當我將MyDataTable參數傳遞給採用DataTable參數的wcf服務方法時,它失敗。 – gangt