首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将引用类型传递给统一的泛型方法

将引用类型传递给统一的泛型方法
EN

Stack Overflow用户
提问于 2017-04-25 00:35:50
回答 1查看 648关注 0票数 1

好吧,这简直快把我逼疯了!我在泛型类中有一个泛型方法。

代码语言:javascript
运行
复制
public interface IHandler<T> where T : class
{
    T[] parseCSV(string InputFileName)
}

public class Handler<T> : IHandler<T> where T : class
{ 
   public T[] parseCSV(string InputFileName)
   {
       if (File.Exists(InputFileName))
       {
           _inputFileName = InputFileName;
           var Engine = new FileHelperEngine<T>();
           return Engine.ReadFile(_inputFileName);
       }
       else
       {
           throw new IOException($"{InputFileName} not found!");
       }
    }
}

我已经在IoC容器中注册了泛型,如下所示:

代码语言:javascript
运行
复制
container.RegisterType(typeof(IHandler<>), typeof(Handler<>));

与几个映射器一起使用FileHelpers包解析文件

代码语言:javascript
运行
复制
container.RegisterType<IMapper1, Mapper1>();
container.RegisterType<IMapper2, Mapper2>();
container.RegisterType<IMapper3, Mapper3>();

我的容器对于我的大部分应用程序来说都是合法的,并且我可以在里面声明IHandler对象。

代码语言:javascript
运行
复制
IHandler<IMapper1> Handler1 = container.Resolve<IHandler<IMapper1>>();

但是,我不知道如何将IMapper1对象传递给泛型parseCSV方法,因此它将在FileHelperEngine中解析。

有人知道如何使用统一将Mapper对象传递给FileHelperEngine吗?我想从客户端代码中获得这种依赖。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-25 01:07:32

parseCSV方法中有一个依赖项。因此,您也应该将它注入到您的类中。有很多方法可以做到这一点,但我更喜欢构造函数注入,而且我已经看到许多其他的开发人员也更喜欢构造函数注入。

因此,您所需要的只是一个接口,然后将实现该接口的类的实例注入到构造函数中,如下所示:

代码语言:javascript
运行
复制
public interface IFileHelperEngine<T> where T : class
{
    T[] ReadFile(string inputFileName);
}

public class Handler<T> : IHandler<T> where T : class
{
    private IFileHelperEngine<T> fileHelperEngine;
    public Handler(IFileHelperEngine<T> fileHelperEngine) //<----See this.
    {
        this.fileHelperEngine = fileHelperEngine;
    }
    public T[] parseCSV(string InputFileName)
    {
        if (File.Exists(InputFileName))
        {
            _inputFileName = InputFileName;
            return this.fileHelperEngine.ReadFile(_inputFileName); //<--and this
        }

        throw new IOException($"{InputFileName} not found!");
    }
}

这实际上很好,因为现在您可以在单元测试IFileHelperEngine类时模拟Handler<T>

FYI,您没有使用.NET命名约定;局部变量应该使用camel case表示法,方法名称应该使用Pascal表示法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43599709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档