如何不指定参数的数据类型?

时间:2014-03-06 09:33:06

标签: c#

我想要Adapter之类的功能。父类需要DataTable,而其派生类可以传入任何内容。我现在将数据类型设置为object然后投射它。但我不认为这很漂亮。

class Parent
{
    protected void Add(DataTable dt) { ... }        // the real business logics
    public virtual void AddRaw(object anything) {}
}

class Child1 : Parent
{
    public override void AddRaw(object anything)
    {
        MyTable1 t = (MyTable1) anything;

        // pseudo code
        DataTable dt = new DataTable();
        foreach(row r in t)
        {
            dt.AddRow(r);
        }

        this.Add(dt);
    }
}

class Child2 : Parent
{
    public override void AddRaw(object anything)
    {
        MyTable2 t = (MyTable2) anything;
        ...
    }
}

我有来自javascriptpython的背景信息。用“弱类型”语言做这些事情是很常见的,你可以在任何地方传递任何东西。

我之前在<T>使用了delegateC#。但我想不出在这里使用它们的方法。

C#这样做的方式是什么?

4 个答案:

答案 0 :(得分:3)

您可以使用dynamic关键字,接口实现或抽象基类,但我个人更喜欢使用尽可能多的类型成员。

使用dynamic

public override void AddRaw(dynamic anything)
{
    // pseudo code
    DataTable dt = new DataTable();
    foreach(row r in anything)
    {
        dt.AddRow(r);
    }

    this.Add(dt);
}

如果您想匹配任何内容并根据类型采取行动,您也可以执行此类操作:

public override void AddRaw(object anything)
{
    if (o is MyTable)
    { ... }
    else if (o is string)
    { ... }
}

答案 1 :(得分:0)

如何重载方法?

class Parent
{
    protected void Add(DataTable dt) { ... }
}

class Child1:Parent
{
    public void Add(MyTable1 anything)
    {
        // pseudo code
        DataTable dt = new DataTable();
        foreach(row r in anything)
        {
            dt.AddRow(r);
        }

        this.Add(dt);
    }
}

class Child2:Parent
{
    public void Add(MyTable2 anything)
    {
        ...
    }
}

答案 2 :(得分:0)

您可以将父类设为通用:

class Parent<T>
{
    protected void Add(DataTable dt) { ... }        // the real business logics
    public virtual void AddRaw(T anything) {}
}

class Child1 : Parent<MyTable1>
{
    public override void AddRaw(MyTable1 anything) { ... }
}

class Child2 : Parent<MyTable2>
{
    public override void AddRaw(MyTable2 anything) { ... }
}

此外,我建议将Parent抽象化,除非您确实需要创建Parent个实例:

abstract class Parent<T>
{
    protected void Add(DataTable dt) { ... }        // the real business logics
    public abstract void AddRaw(T anything);
}

这样,编译器确保每个客户端必须实现AddRaw

答案 3 :(得分:0)

我想我会使用适配器解析器类。在自己的类中创建每个适配器,并使用静态类及其适配器类型

注册它们
Adapters.Register(typeof(MyTable), MyTableAdapter)

或 // void Register(Adapter)和MyTableAdapter:Adapter     Adapters.Register(MyTableAdapter)

然后你要从适配器列表

请求一个适配器
Adapters.GetAdapter<MyTable>();

如果没有注册该类型的适配器,则可以返回合理的错误