对接口使用通用约束

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?

假设 FooBar 都实现了 INeedAction,并且 Foo 有一个 属性 类型 Bar

那么一个MyWorkerClass<Foo>代表一个能够在FooDoWork的作品。到目前为止,一切都很好。但是,看看调用 DoWork 时会发生什么,它会找到 Bar 属性。由于 Bar 实现了 INeedAction,您调用

this.DoWork (bar as INeedAction);

请记住 this 仍然是 MyWorkerClass<Foo> - 一个只能在 Foo 上工作的东西,但是你给它一个 Bar 来工作!这没有意义,是吗?这就是为什么不能将 INeedWork 传递给接受 T.

的参数的原因

另请注意,DoWork 不是通用的。它接受一个非常特殊的类型——T。这必须与 class 的类型参数中使用的 T 相同。


从您的代码来看,我认为 DoWork 根本不应该是通用的。它应该接受 INeedWork.