c# - 如何在注入(inject)的类上调用泛型方法而不通知泛型类型的父类?

标签 c# .net generics interface dependency-injection

下面是注入(inject)另一个类的依赖项的实现。

public class CsvDataProvider : ICsvDataProvider
{
    readonly ICsvReaderFactory _factory;

    public CsvDataProvider(ICsvReaderFactory factory)
    {
        _factory = factory;
    }

    public IEnumerable<TRecord> GetData<TRecord>(string filepath) where TRecord : class
    {
        var reader = _factory.CreateCsvReader(filepath);

        return reader.GetRecords<TRecord>();
    }
}

readerfactory 创建将读取 CSV 文件中的所有行并将每行转换为 TRecord 的实例。我不拥有 reader代码并且无法更改 GetRecords<TRecord>()方法。

这就是我陷入困境的地方:

public class CsvDataMigrationController
{
    readonly ICsvDataProvider _provider;
    readonly ICsvDataMigration _migration;

    public CsvDataMigrationController(ICsvDataProvider provider, ICsvDataMigration migration)
    {
        _provider = provider;
        _migration = migration;
    }

    public void ProcessFile(string path)
    {
        var records = _provider.GetData<I_DONT_WANT_TO_EXPLICITLY_SAY>(path); //<-- Help!

        _migration.Migrate(records);
    }
}

目的是将数据提供者和迁移过程类注入(inject) CsvDataMigrationController 。 Controller 会调用数据提供者来获取数据并将数据传递到迁移类中。

  • 我不想要 CsvDataMigrationController了解所涉及的数据类型。
  • 我不想要 CsvDataProvider了解迁移情况。
  • 我不想要 CsvDataMigration了解数据来自哪里。

关于如何实现这一目标有什么建议吗?

注意:我没有包含 CsvDataMigration类,因为我认为它在解释中没有用,但如果需要的话会包含它。

最佳答案

好吧,既然你无法更改GetRecords,那么也许最直接的方法就是向迁移接口(interface)询问记录类型,并使用反射来调用通用的GetData 具有该运行时获取类型的方法。像这样的东西:

public void ProcessFile(string path)
{
    Type recordType = _migration.InputRecordType;

    var getDataMethod =
        _provider.GetType()
        .GetMethod("GetData")
        .MakeGenericMethod(recordType);

    var records = getDataMethod.Invoke(_provider, new object[] { path });
    _migration.Migrate(records);
}

关于c# - 如何在注入(inject)的类上调用泛型方法而不通知泛型类型的父类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14950696/

相关文章:

c# - 通用容器内是什么类型

c# - 如何在 asp .net 中的字符串变量中获取文件上传控件的完整路径?

c# - Azure 表存储查询从错误分区返回数据?

C# 罗技 G19 SDK 入门?

c# - 如何从 C# 程序中检索 WMI 数据(例如 UUID)?

.net - 针对 .lib 编译的 C++/CLI 托管 DLL 无法加载,具有 .dll 依赖性。 (VS2010)

java - 为什么Java声称1.5版本需要向后兼容?

c# - 继承静态成员的静态初始化

c# - 处理 DBNull 的最佳方法是什么

c# - TreeNode SelectNodeChanged 事件 c#