C#等价于<!-?扩展类型->?

时间:2019-01-31 23:58:10

标签: c# generics

我正在使用C#。我在代码中创建了一个称为EntityInterface的接口。我写了这个函数:

private void Save(List<EntityInterface> entities)
{ ... }

在代码的其他地方,我有一个变量定义为List<Job>。 Job类是实现EntityInterface的类。

我无法将Job对象列表传递给Save方法。编译器抱怨该参数类型错误,因为List<Job>List<EntityInterface>不同。

我需要修改该函数以表达该参数可以是“实现EntityInterface的任何对象的列表”的想法。我已经搜索了一下,但是找不到如何执行此操作的示例。

1 个答案:

答案 0 :(得分:1)

您的模型应如下所示:

using System.Collections.Generic;

public interface IEntity
{
    void Save<T>(List<T> entities) where T : IEntity;
}

public class Job : IEntity
{
    void IEntity.Save<T>(List<T> entities) { }
}

public class TargetImpl : IEntity
{
    void IEntity.Save<T>(List<T> entities) { }
}

并作为逐步测试:

using System.Collections.Generic;
using Xunit;

public class UnitTest1
{
    [Fact]
    public void Test1()
    {
        IEntity ientity = new TargetImpl();
        ientity.Save(new List<Job>());
    }
}

上面的示例有一个警告,为简洁起见,该类显式实现了IEntity接口,因为此类子实现必须通过该接口显式引用。对于类似但微妙的实现,您也可以执行以下操作:

public class Job : IEntity
{
    public void Save<T>(List<T> entities) where T : IEntity { }
}

public class TargetImpl : IEntity
{
    public void Save<T>(List<T> entities) where T : IEntity { }
}

和测试提示可以(可选)更改为:

[Fact]
public void Test1()
{
    targetImpl ientity = new TargetImpl();
    ientity.Save(new List<Job>());
}