C#确保在迭代超类型列表时,自定义强制转换使用超类型的子类型

时间:2011-03-31 14:51:55

标签: c# .net

我有以下代码。我打算使用语法

将此自定义对象强制转换为Int32类型

i =(int)obj;

其中'obj'的类型为'SubClass'。

强制转换的运算符在抽象SuperType的每个SubType中定义,并且也在抽象SuperType中定义。由于抽象超类型中的运算符不能标记为虚拟,因此超类型的强制转换会故意引发异常。

如果我尝试在foreach循环中进行转换,循环遍历一个类型'SuperType'的列表,C#尝试使用SuperType上的运算符进行转换(并抛出编程的异常),我希望它使用运营商

我希望它会使用子类型进行投射。

我可能正在努力解决这个问题,但我现在感兴趣的是我是否能够在我认为优雅的解决方案中实现这一目标。

任何建议表示赞赏!

//循环......

foreach (PriceIndexAction objs in objList)
{
    int i = (int) action;
}

// SuperClass ..

   public abstract class SuperClass
    { 

        protected SuperClass( DateTime p1, int p2, int p3, int p4 )
        {
           ....
        }

        public static implicit operator Int32(PriceIndexAction obj)
        {
            throw new InvalidCastException( "No cast to System.Int32 exists for the abstract class   PriceIndexAction.");
        }
    }

// SubClass ..

public class SubClass : SuperClass
{

      public SubClass(DateTime p1, int p2 )
                    : base( p1, p2, 1, 2 )
      {
         ....
      }


      public static implicit operator Int32(SubClass obj)
      {
          return 2;
      }
 }`enter code here`

2 个答案:

答案 0 :(得分:3)

public abstract class SuperClass
{
    public static implicit operator int(SuperClass obj)
    {
        return obj.ToInt32();
    }

    protected abstract int ToInt32();
}

然后在派生类中覆盖/实现ToInt32

答案 1 :(得分:1)

自定义投射操作符不能是virtual(因为它们是static);这是不可能的。

相反,您应该制作一个普通的abstract实例方法。 (例如,ToInt) 然后,您可以从强制转换操作符中调用它。