-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 クラスを作成しました。

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

1 に答える 1

-1

なぜ DataTable を拡張するのですか? メソッドの追加を検討している場合は、Extension Methodsを調べる必要があります。DataTable クラスには、オーバーライドできる仮想メソッドやプロパティがなく、メンバーの非表示はポリモーフィズムでは機能しないと確信しています。 DataTable を拡張しようとしていた別のビューについては、この投稿を確認してください。

編集:

WCF を介してオブジェクトを渡そうとする場合は、Serializableとマークする必要がありますが、これにより他のファンキーな問題が発生し、基本クラスに何らかの特別なシリアル化がある場合は拒否される可能性があります。その場合、派生クラスを [Serializable] としてマークすると、同様にエラーが発生します。

あなたが説明したことから、ファクトリーパターンを真剣に検討します。そうすれば、毎回必要な方法でテーブルを構築するファクトリ クラスを作成できますが、それは依然として DataTable です。

データテーブルにオブジェクト (プリミティブではない) がある場合は、シリアル化されたデータテーブル内にシリアル化されたものがあることを認識できるように、WCF サービスに「KnownTypes(typeof(MyType))」を指定する必要があります。

最後に、WCF でデータテーブルとデータセットを使用しないようにする必要があります...

WebServices から DataSet を返すことは悪魔の卵であり、世界で真に悪であるすべてを表しています

データセットを使用した WCF のパフォーマンス – パート 2

于 2012-10-01T19:39:41.480 に答える