簡體   English   中英

在 C# 中實現多參數泛型方法

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

我正在嘗試學習泛型,但有些事情我無法理解。

以下是正在使用的接口和類:

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

您需要在某處傳遞輸入參數。 最好的選擇是擴展方法簽名以接受這樣的輸入參數:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM