我正在尝试学习泛型,但有一些事情我不能理解。
以下是播放中的接口和类:
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 ????
}
答案 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 };
}
}