请让我用这个例子解释我的问题:
如果我扩展DataTable和DataColumn:
class MyTable: DataTable
{
// Columns in here.
}
class MyColumn: DataColumn
{
}
我的问题是,如何让MyTable类的列使用扩展的MyColumn,而不是原始的DataColumn?
感谢。
答案 0 :(得分:2)
如果MyColumns派生自DataColumn,您可以将它们作为DataColumn放入DataTable中。然后,您的MyTable可以提取列并将它们上传到MyColumn。
请注意,这不是最佳选择;你可能最好使用其他而不是ADO.NET 2.但如果这是你必须去的路线,那么这是你的选择。
注意:在向上转换为MyColumn之前,应始终测试DataColumn对象的类型,以免InvalidCastException成为您的问题。
答案 1 :(得分:2)
我不确定你要完成什么,但从基础对象派生可能是最好的途径。给这个人一个旋转...
public class MyDataColumnCollection : InternalDataCollectionBase
{
private readonly ArrayList _list = new ArrayList();
protected override ArrayList List
{
get
{
return this._list;
}
}
public void Add(MyDataColumn c)
{
this.List.Add(c);
}
}
public class MyDataTable : DataTable
{
private MyDataColumnCollection _columns = new MyDataColumnCollection();
public new MyDataColumnCollection Columns
{
get { return this._columns; }
}
}
public class MyDataColumn : DataColumn
{
public string MyCustomProperty { get; set; }
}
static void Main(string[] args)
{
MyDataTable t = new MyDataTable();
MyDataColumn c = new MyDataColumn();
c.ColumnName = "My Test Column";
c.MyCustomProperty = "This is really cool!";
t.Columns.Add(c);
foreach (MyDataColumn mdc in t.Columns)
{
System.Diagnostics.Debug.WriteLine(mdc.MyCustomProperty);
}
}
自定义KeyedCollection<>
的来源public class MyDataColumnCollection :
KeyedCollection<string, MyDataColumn>
{
protected override string GetKeyForItem(MyDataColumn item)
{
return item.ColumnName;
}
}
public class MyDataTable : DataTable
{
private MyDataColumnCollection _columns = new MyDataColumnCollection();
public new MyDataColumnCollection Columns
{
get { return this._columns; }
}
}
public class MyDataColumn : DataColumn
{
public string MyCustomProperty { get; set; }
}
static void Main(string[] args)
{
MyDataTable t = new MyDataTable();
MyDataColumn c = new MyDataColumn();
c.ColumnName = "My Test Column";
c.MyCustomProperty = "This is really cool!";
t.Columns.Add(c);
foreach (MyDataColumn mdc in t.Columns)
{
System.Diagnostics.Debug.WriteLine(mdc.MyCustomProperty);
}
MyDataColumn testColumn = t.Columns["My Test Column"];
System.Diagnostics.Debug.WriteLine(testColumn.MyCustomProperty);
}
使用C#扩展解决方案:
namespace ExtensionMethods
{
public static class MyExtensions
{
public static void UpdateValue(this DataTable dt)
{
// add code to update data in the DataTable
}
}
}
// in another class...
DataTable myDataTable = (Get DataTable object);
myDataTable.UpdateValue();
答案 2 :(得分:0)
另一种解决方案是使用接口。
例如,为IDataColumn和IDataTable定义接口。 然后,每个实现都将从接口继承。
初始化DataTable对象时,传递相应的MyColoum1,MyColoum2等。 这很像多态,只有接口允许你定义绝对契约,而没有任何具体的实现。