继承自DataTable的问题

时间:2012-10-01 19:33:03

标签: c# ado.net datatable

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

1 个答案:

答案 0 :(得分:-1)

为什么要扩展DataTable?如果您要添加方法,请查看Extension Methods。我很确定DataTable Class没有任何可以覆盖的虚拟方法或属性,而memeber隐藏在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