繁体   English   中英

将通用阅读器传递给方法

[英]Passing generic reader to a method

我有办法

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等。

提前致谢。

如果您最终使用的所有阅读器都使用了索引运算符(方括号),那么您可以使用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;
}

PS 为了良好的代码结构,我建议将此方法移到它所属的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);

只要那些读者具有共同的基类或接口,这是完全可能的。 例如, StringReaderStreamReader都是TextReader 因此,如果只需要使用TextReader成员,则应将其设置为参数的类型。 但是,如果不同的阅读器提供了不同的接口,而您需要使用不同的接口,那么您将很不走运,并且需要多个重载。 要么,要么您需要为不同的阅读器提供一些包装,以便它们都为您的方法提供一个通用接口。 不幸的是, StreamReaderOleDbReader几乎没有共同点,如果您看它们,这是可以理解的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM