简体   繁体   English

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

[英]Implementing a multi parameter generic method in C#

I am trying to learn generics, but there is some things I just cant wrap my head around.我正在尝试学习泛型,但有些事情我无法理解。

Here are the interfaces and classes in play:以下是正在使用的接口和类:

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 };
    }
}

The problem occurs when I try to implement the second method in the queryExecutor:当我尝试在 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);
    }        
}

I want to pass T1 as parameter to the method implementation, but that is not possible (could be done by using an IoC container like Autofac, but that's not what I want).我想将 T1 作为参数传递给方法实现,但这是不可能的(可以通过使用像 Autofac 这样的 IoC 容器来完成,但这不是我想要的)。 Help!帮助! There must be some very basics of generics I don't understand.一定有一些非常基础的泛型我不明白。

So the question is, how do I implement:所以问题是,我如何实施:

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

You need to pass input parameter somewhere.您需要在某处传递输入参数。 The best option would be to extend method signature to accept input parameter like this:最好的选择是扩展方法签名以接受这样的输入参数:

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

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

The second option is to remove a second version of your IQuery interface pass input parameter in constructor.第二个选项是在构造函数中删除 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 };
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM