在接口中包含泛型类型参数,由接口约束
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>
:
我坚持使用受接口约束的实现。我的用法对我来说很直观,但无法编译,所以我误解了一些东西。
我的界面:
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>
: