2

我有一个延伸到的课程Control

public foo : Control 
{
  //.. 
}

然后我得到一个控制:

var baa = (((foo)((Control)Controls.Find(controlName, true).First()));
baa.etc = ..; 

但是当我这样做时:

 ((PictureBox)((Control)controlImg)).MyExtensionMethod(..) 

我得到一个例外

无法将“System.Windows.Forms.PictureBox”类型的对象转换为“ControlExtensions.foo”类型。

如何解决此异常并让我知道。

谢谢你。

4

2 回答 2

4

没有办法解决这个问题。你的课foo是正确的。错误消息说明了一切。foo不继承PictureBox。如果foo是某种图片框,请实现PictureBox类而不是Control.

给你一个现实生活中的例子:

interface IAnimal { }
class Dog : IAnimal { public static void Bark() { } }
class Cat : IAnimal { public static void Meow() { } }

的签名与定义的Cat不同,而没有。定义,而没有。例如,以下带有注释的代码将帮助您理解这一点:DogCatCat.Meow()DogDogDog.Bark()Cat

class Program
{
    static void Main(string[] args)
    {
        Dog myDog = new Dog(); // myDog contains definition for Bark
        IAnimal myPet = (IAnimal)myDog; // Cast not necessary.
                                        // myPet's signiature is of Dog, but typeof(myPet)
                                        //   is Animal as it was boxed (google for help on this)
        Cat myCat = (Cat)myPet // now try and imagine this in real life
                               // (turning a dog into a cat) [I don't even]
                               // It doesn't work because Cat doesn't
                               //   contain a definition for Bark()
        Cat myDimentedCat = (Cat)(IAnimal)myDog; // which is why this code fails.
    }
}


我要展示的内容与以下内容相同a square is a rectangle, but a rectangle isn't always a square

interface IRectangle { }
interface ISquare : IRectangle { }
于 2012-06-06T04:03:00.977 回答
0

评论中的安东尼和回答中的科尔都向您展示了异常的来源。至于如何修复它,我不确定我是否得到了你想要做的事情,但是看看你试图调用的方法的名称,以及你说 foo “扩展”控制的事实,它在我看来,您正在尝试扩展 Windows 窗体控件的行为,添加一些 MyExtensionMethod。如果是这种情况,则不应创建从 Control 派生的 foo 类,而应创建包含所需扩展方法的静态类。即你的代码应该是这样的:

public static class SomeControlExtensions
{
    public static int MyExtensionMethod(this Control aCtl)
    {
        // whatever you want
    }
} 

扩展方法总是至少有一个参数来表示消息的接收者。这由参数类型之前的关键字“this”标识。通过这种方式,您将能够编译:

Control baa = (Control)Controls.Find(controlName, true).First();
baa.MyExtensionMethod();
于 2012-06-06T04:46:50.320 回答