在接口中包含泛型类型参数,由接口约束

Including a generic type parameter in interface, constraint by an interface

我坚持使用受接口约束的实现。我的用法对我来说很直观,但无法编译,所以我误解了一些东西。

我的界面:

interface IEntity
{
    int ExampleMethod(IContext<IFooBar> context);
}

interface IContext<T> where T : class, IFooBar
{
    T FooBar { get; set; }
}

interface IFooBar
{
    int Value { get; }
}

我的实现:

class Entity : IEntity
{
    public int ExampleMethod(IContext<IFooBar> context)
    {
        return context.FooBar.Value;
    }
}

class Context : IContext<FooBar>
{
    public FooBar FooBar { get; set; }
}

class FooBar : IFooBar
{
    public int Value { get { return 10; } }
}

实体的使用class,抛出问题的地方

class UsageOfEntity
{
    public UsageOfEntity()
    {
        var context = new Context();
        var entity = new Entity();

        int result = entity.ExampleMethod(context);
    }
}

实例context的用法抛出错误:

Argument 1: cannot convert from 'Context' to 'IContext<IFooBar>'

如何约束泛型类型参数以便可以使用我的实现?

您的代码中的问题是您正在尝试将 Context 转换为 Type IContext,就像您的错误告诉您的那样。

{
    public UsageOfEntity()
    {
        var context = new Context();
        var entity = new Entity();

        int result = entity.ExampleMethod(context);
    }
}

您正试图在这一行中将 Context 传递给 IContext

entity.ExampleMethod(context);

您应该使 Type 传入 ExampleMethod() Context<FooBar>。 我还想指出,为 POCO class 创建接口是不必要的,只需将其保持为正常 class.

您的代码应如下所示:

class Entity : IEntity
{
    public int ExampleMethod(Context<FooBar> context)
    {
        return context.FooBar.Value;
    }
}

interface IEntity
{
    int ExampleMethod(IContext<IFooBar> context);
}

上下文是 IContext<FooBar> 而不是 IContext<IFooBar>

因为OP已经在评论中指出IContext<T>.FooBar只需要read-only,T可以协变:

interface IContext<out T>
where T : class, IFooBar
{
    T FooBar { get; }
}

现在,因为 FooBar 实现了 IFoobar,所以可以使用 IContext<FooBar> 代替 IContext<IFooBar>: