C# 将泛型读取器传递给方法

C# 将泛型读取器传递给方法,c#,generics,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();

我有办法

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();
}
这个方法也一样。但问题是初始化Ecustomer'reader'的参数将取决于我读取的文件类型。有时我必须从xls文件中读取数据,有时我必须从CSV等文件中读取数据。我可以使用不同的读取器来重载方法。但是有没有可能有一种方法适用于任何类型的阅读器,如oledbreader、streamreader等


提前感谢。

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

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

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

如果您最终使用的所有读卡器碰巧都使用了索引运算符(方括号),那么您只需使用
动态

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);

所有这些类都从何而来?Customer是程序中定义的类。未使用继承。什么是
读卡器的类型?读卡器类型取决于文件的类型。如果是xls文件,则读卡器类型为oledbreader;如果是csv文件,则为streamreader等。所有这些类的来源是什么?客户是程序中定义的类。未使用继承。什么是
读卡器的类型?读卡器类型取决于文件的类型。如果是xls文件,则读卡器类型为oledbreader;如果是csv文件,则为streamreader等。