下面是注入(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>();
}
}
reader
由 factory
创建将读取 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/