对接口使用通用约束
Use constraint generic with interface
我有以下涉及泛型的代码:
public class MyWorkerClass<T> : IWorkerContract<T> //in IWorkerContract also i have same generic constraint that i have in this class.
where T: INeedAction, new()
{
public void DoWork ( T item )
{
//Loop on each property of item...
if ( ..if current property value implement from INeedAction, then condition for recursion.. )
{
this.DoWork ( currentPropertyValue as INeedAction);
//Get error -> "Can not convert INeedAction to T"
}
基本上我有一个操作对象 'A' 的 woker(需要实现接口 INeedAction)。
如果该对象的任何 属性 'A' 实现了对象本身的相同接口(i INeedAction 接口),那么我也需要在该 属性 上使用相同的 DoWork 逻辑进行递归。
奇怪的是,我收到了我不理解的错误:“无法将 INeedAction 转换为 T”
为什么会这样,如果我强制要求 T 必须实施 INeedAction?
假设 Foo
和 Bar
都实现了 INeedAction
,并且 Foo
有一个 属性 类型 Bar
。
那么一个MyWorkerClass<Foo>
代表一个能够在Foo
上DoWork
的作品。到目前为止,一切都很好。但是,看看调用 DoWork
时会发生什么,它会找到 Bar
属性。由于 Bar
实现了 INeedAction
,您调用
this.DoWork (bar as INeedAction);
请记住 this
仍然是 MyWorkerClass<Foo>
- 一个只能在 Foo
上工作的东西,但是你给它一个 Bar
来工作!这没有意义,是吗?这就是为什么不能将 INeedWork
传递给接受 T
.
的参数的原因
另请注意,DoWork
不是通用的。它接受一个非常特殊的类型——T
。这必须与 class 的类型参数中使用的 T
相同。
从您的代码来看,我认为 DoWork
根本不应该是通用的。它应该接受 INeedWork
.
我有以下涉及泛型的代码:
public class MyWorkerClass<T> : IWorkerContract<T> //in IWorkerContract also i have same generic constraint that i have in this class.
where T: INeedAction, new()
{
public void DoWork ( T item )
{
//Loop on each property of item...
if ( ..if current property value implement from INeedAction, then condition for recursion.. )
{
this.DoWork ( currentPropertyValue as INeedAction);
//Get error -> "Can not convert INeedAction to T"
}
基本上我有一个操作对象 'A' 的 woker(需要实现接口 INeedAction)。 如果该对象的任何 属性 'A' 实现了对象本身的相同接口(i INeedAction 接口),那么我也需要在该 属性 上使用相同的 DoWork 逻辑进行递归。
奇怪的是,我收到了我不理解的错误:“无法将 INeedAction 转换为 T” 为什么会这样,如果我强制要求 T 必须实施 INeedAction?
假设 Foo
和 Bar
都实现了 INeedAction
,并且 Foo
有一个 属性 类型 Bar
。
那么一个MyWorkerClass<Foo>
代表一个能够在Foo
上DoWork
的作品。到目前为止,一切都很好。但是,看看调用 DoWork
时会发生什么,它会找到 Bar
属性。由于 Bar
实现了 INeedAction
,您调用
this.DoWork (bar as INeedAction);
请记住 this
仍然是 MyWorkerClass<Foo>
- 一个只能在 Foo
上工作的东西,但是你给它一个 Bar
来工作!这没有意义,是吗?这就是为什么不能将 INeedWork
传递给接受 T
.
另请注意,DoWork
不是通用的。它接受一个非常特殊的类型——T
。这必须与 class 的类型参数中使用的 T
相同。
从您的代码来看,我认为 DoWork
根本不应该是通用的。它应该接受 INeedWork
.