将通用读者传递给方法

时间:2011-01-12 18:42:44

标签: c# generics

我有一个方法

public Customer InitializeCustomer (reader)
{
        Customer customer =new Customer();

        customer.CompanyName = reader[1].ToString();

        customer.Address1 = reader[2].ToString();

        customer.Address2 = reader[3].ToString();

        customer.City = reader[4].ToString();

        customer.State = reader[5].ToString();

        customer.Zip = reader[6].ToString();
}

这种方法是一样的。但问题是InitializeCustomer'reader'的参数将取决于我所读取的文件类型。有一段时间我必须从xls文件中读取数据,有时还要读取CSV等。我可以使用不同的读取器重载方法。但是有可能有一种方法适用于任何类型的读者,如oledbreader,streamreader等。

提前致谢。

2 个答案:

答案 0 :(得分:2)

如果你最终使用的所有读者都碰巧使用了索引操作符(方括号),那么你可以使用dynamic

public Customer InitializeCustomer (dynamic reader)
{
    Customer customer = new Customer();

    // Automatically calls the [1] indexer for whatever class reader is
    customer.CompanyName = reader[1].ToString();
    // ...

    return Customer;
}

P.S。 为了良好的代码结构,我建议将此方法移动到它所属的Customer类。例如:

public static Customer FromReader(dynamic reader)
{
    Customer customer = new Customer();

    // Automatically calls the [1] indexer for whatever class reader is
    customer.CompanyName = reader[1].ToString();
    // ...

    return Customer;
}

[...]

var customer = Customer.FromReader(myDbReader);

答案 1 :(得分:1)

只要这些读者具有共同的基类或接口,这是完全可能的。例如,StringReaderStreamReader都是TextReader。因此,如果您只需要使用TextReader的成员,则应该将其作为参数的类型。但是,如果您的不同读者暴露出您需要以不同方式使用的不同接口,那么您运气不好,并且您将需要多次重载。或者你需要为不同的读者提供一些包装器,以便它们都为你的方法提供一个通用的接口。不幸的是,StreamReaderOleDbReader几乎没有共同之处,如果你看一下,这是可以理解的。