Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何正确实现通用接口方法?_C#_Generics_Interface - Fatal编程技术网

C# 如何正确实现通用接口方法?

C# 如何正确实现通用接口方法?,c#,generics,interface,C#,Generics,Interface,我试图实现泛型接口方法,但不断出现错误。我粘贴代码是为了更好地解释我想做什么 我试图实现的是:基于一些输入数据(SomeModelA,SomeModelB),我希望得到相同的返回类型(模板) 我得到一个错误,说: 错误CS1503参数1:无法从“System.Collections.Generic.List of SomeModelA”转换为“System.Collections.Generic.List of GenericInterfacePuzzle.SomeModelA” 任何反馈都了解

我试图实现泛型接口方法,但不断出现错误。我粘贴代码是为了更好地解释我想做什么

我试图实现的是:基于一些输入数据(SomeModelA,SomeModelB),我希望得到相同的返回类型(模板)

我得到一个错误,说:

错误CS1503参数1:无法从“System.Collections.Generic.List of SomeModelA”转换为“System.Collections.Generic.List of GenericInterfacePuzzle.SomeModelA”

任何反馈都了解这里可能出现的问题,以及为什么它在传递给函数时无法识别模型类

Chris

1)您需要在接口级别定义通用参数。否则,编译器不知道
T
参数:

public interface IWorker<T> where T: SomeModel
{
    Template Get(List<T> someModels);
}
通过这种方式,您可以在实现接口的类的声明中直接指定模型(参见第3点)

3) 现在,您需要在子类中指定哪个模型属于哪个workertype:

public class WorkerA : IWorker<SomeModelA>
{
    public Template Get(List<SomeModelA> someModels)
    {
        ProcessModels(someModels);
        return new Template(); // let's say it's based on the result of ProcessModels
    }

    private void ProcessModels(List<SomeModelA> models)
    {
        var x = models.First();
    }
}

public class WorkerB : IWorker<SomeModelB>
{
    public Template Get(List<SomeModelB> someModels)
    {
        ProcessModels(someModels);
        return new Template(); // let's say it's based on the result of ProcessModels
    }

    private void ProcessModels(List<SomeModelB> models)
    {
        var x = models.First();
    }
}
在您实现接口时已指定此选项:

public class WorkerA : IWorker<SomeModelA>
公共类工作时代:IWorker
4) 最后一件事是用主方法进行测试:

var worker = new WorkerA();
var itemsBasedOnModelA = worker.Get(new List<SomeModelA>());

var workerB = new WorkerB();
var itemsBasedOnModelB = worker.Get(new List<SomeModelB>());
                           ^
                           |
                    this should be [workerB]!
var-worker=new-WorkerA();
var itemsBasedOnModelA=worker.Get(new List());
var workerB=新workerB();
var itemsBasedOnModelB=worker.Get(new List());
^
|
这应该是[workerB]!

在哪一行您得到了错误btw?您从来没有使用您的
workerB
btw泛型类型参数必须在接口上而不是在方法上:
公共接口IWorker
然后您可以实现您想要的:
公共类WorkerA:IWorker
。您有两个同名的类
SomeModelA
为什么你得到了以上的例外。尝试如下=>
var itemsBasedOnModelA=worker.Get(new List())
public class WorkerA : IWorker<SomeModelA>
{
    public Template Get(List<SomeModelA> someModels)
    {
        ProcessModels(someModels);
        return new Template(); // let's say it's based on the result of ProcessModels
    }

    private void ProcessModels(List<SomeModelA> models)
    {
        var x = models.First();
    }
}

public class WorkerB : IWorker<SomeModelB>
{
    public Template Get(List<SomeModelB> someModels)
    {
        ProcessModels(someModels);
        return new Template(); // let's say it's based on the result of ProcessModels
    }

    private void ProcessModels(List<SomeModelB> models)
    {
        var x = models.First();
    }
}
public Template Get<SomeModelA>(List<SomeModelA> someModels)
                      ^
                      |
                   remove this
public class WorkerA : IWorker<SomeModelA>
var worker = new WorkerA();
var itemsBasedOnModelA = worker.Get(new List<SomeModelA>());

var workerB = new WorkerB();
var itemsBasedOnModelB = worker.Get(new List<SomeModelB>());
                           ^
                           |
                    this should be [workerB]!