C#如何扩展另一个类使用的类?

时间:2010-12-28 01:59:53

标签: c#

请让我用这个例子解释我的问题:

如果我扩展DataTable和DataColumn:

class MyTable: DataTable
{
    // Columns in here.
}

class MyColumn: DataColumn
{
}

我的问题是,如何让MyTable类的列使用扩展的MyColumn,而不是原始的DataColumn?

感谢。

3 个答案:

答案 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等。 这很像多态,只有接口允许你定义绝对契约,而没有任何具体的实现。