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
}
}
答案 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中使用数据表和数据集......