C# 无法强制转换对象类型';PictureBox';到myClassControl

C# 无法强制转换对象类型';PictureBox';到myClassControl,c#,casting,controls,C#,Casting,Controls,我有一个扩展到控件的类: public foo : Control { //.. } 然后我得到一个控制: var baa = (((foo)((Control)Controls.Find(controlName, true).First())); baa.etc = ..; 但当我这样做的时候: ((PictureBox)((Control)controlImg)).MyExtensionMethod(..) 我得到一个异常: 无法将“System.Windows.Form

我有一个扩展到
控件的类

public foo : Control 
{
  //.. 
}
然后我得到一个控制:

var baa = (((foo)((Control)Controls.Find(controlName, true).First()));
baa.etc = ..; 
但当我这样做的时候:

 ((PictureBox)((Control)controlImg)).MyExtensionMethod(..) 
我得到一个异常:

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

如何修复此异常并让我知道


谢谢。

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

给你一个真实的例子:

interface IAnimal { }
class Dog : IAnimal { public static void Bark() { } }
class Cat : IAnimal { public static void Meow() { } }
Cat
的签名不同于
Dog
,因为
Cat
定义了
Cat.Meow()
,而
Dog
没有
Dog
定义了
Dog.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.
    }
}

我想展示的是,正方形是矩形,但矩形并不总是正方形

interface IRectangle { }
interface ISquare : IRectangle { }

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

给你一个真实的例子:

interface IAnimal { }
class Dog : IAnimal { public static void Bark() { } }
class Cat : IAnimal { public static void Meow() { } }
Cat
的签名不同于
Dog
,因为
Cat
定义了
Cat.Meow()
,而
Dog
没有
Dog
定义了
Dog.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.
    }
}

我想展示的是,正方形是矩形,但矩形并不总是正方形

interface IRectangle { }
interface ISquare : IRectangle { }

评论中的安东尼和回答中的科尔都向你展示了例外的来源。至于如何修复它,我不确定我是否完全理解了您的意图,但看看您试图调用的方法的名称,以及您说foo“extensions”控件的事实,在我看来,您似乎在尝试扩展windows窗体控件的行为,添加一些MyExtensionMethod。如果是这种情况,则不应创建从控件派生的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();

评论中的安东尼和回答中的科尔都向你展示了例外的来源。至于如何修复它,我不确定我是否完全理解了您的意图,但看看您试图调用的方法的名称,以及您说foo“extensions”控件的事实,在我看来,您似乎在尝试扩展windows窗体控件的行为,添加一些MyExtensionMethod。如果是这种情况,则不应创建从控件派生的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();

foo扩展了控制。PictureBox扩展了控制。这就是共同性的终结。狗是一种动物。猫是一种动物。试着把狗变成猫。看看结果如何。foo扩展了控件。PictureBox扩展了控制。这就是共同性的终结。狗是一种动物。猫是一种动物。试着把狗变成猫。看看结果如何。