在C#中实现多参数泛型方法

时间:2017-10-07 18:46:26

标签: c# generics

我正在尝试学习泛型,但有一些事情我不能理解。

以下是播放中的接口和类:

public interface IQueryExecutor
{
    T ExecuteQuery<T>(IQuery<T> query);

    T ExecuteQuery<T, T1>(IQuery<T, T1> query);        
}

public interface IQuery<out T>
{
    T Execute();        
}

public class StringQuery : IQuery<string>
{
    public string Execute()
    {
        return "String query executed";
    }
}

public interface IQuery<out T, in T1>
{
    T Execute(T1 input);
}

public class ListQuery : IQuery<List<string>, string>
{
    public List<string> Execute(string input)
    {
        return new List<string>() { input };
    }
}

当我尝试在queryExecutor中实现第二个方法时出现问题:

public class QueryExecutor : IQueryExecutor
{
    public T ExecuteQuery<T>(IQuery<T> query)
    {
        return query.Execute();
    }

    public T ExecuteQuery<T, T1>(IQuery<T, T1> query)
    {
        return query.Execute(T1 input);
    }        
}

我想将T1作为参数传递给方法实现,但这是不可能的(可以通过使用像Autofac这样的IoC容器来完成,但这不是我想要的)。救命!必须有一些我不懂的泛型基础知识。

所以问题是,我该如何实现:

public T ExecuteQuery<T, T1>(IQuery<T, T1> query)
{
        return ????
}  

1 个答案:

答案 0 :(得分:1)

您需要在某处传递输入参数。最好的选择是扩展方法签名以接受输入参数,如下所示:

public interface IQueryExecutor
{
    T ExecuteQuery<T>(IQuery<T> query);

    T ExecuteQuery<T, T1>(IQuery<T, T1> query, T1 input);        
}

第二个选项是在构造函数中删除IQuery接口传递输入参数的第二个版本。

public class ListQuery : IQuery<List<string>>
{
    private string _input;

    public ListQuery(string input)
    {
       _input= input;
    }
    public List<string> Execute()
    {
        return new List<string>() { _input };
    }
}