C# 如何正确实现通用接口方法?
我试图实现泛型接口方法,但不断出现错误。我粘贴代码是为了更好地解释我想做什么 我试图实现的是:基于一些输入数据(SomeModelA,SomeModelB),我希望得到相同的返回类型(模板) 我得到一个错误,说: 错误CS1503参数1:无法从“System.Collections.Generic.List of SomeModelA”转换为“System.Collections.Generic.List of GenericInterfacePuzzle.SomeModelA” 任何反馈都了解这里可能出现的问题,以及为什么它在传递给函数时无法识别模型类 Chris1)您需要在接口级别定义通用参数。否则,编译器不知道C# 如何正确实现通用接口方法?,c#,generics,interface,C#,Generics,Interface,我试图实现泛型接口方法,但不断出现错误。我粘贴代码是为了更好地解释我想做什么 我试图实现的是:基于一些输入数据(SomeModelA,SomeModelB),我希望得到相同的返回类型(模板) 我得到一个错误,说: 错误CS1503参数1:无法从“System.Collections.Generic.List of SomeModelA”转换为“System.Collections.Generic.List of GenericInterfacePuzzle.SomeModelA” 任何反馈都了解
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]!