无法将对象类型“PictureBox”强制转换为 myClassControl
本文关键字:转换 myClassControl PictureBox 对象 类型 | 更新日期: 2023-09-27 18:36:28
我有一个扩展到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"。
如何解决此异常并让我知道。
谢谢。
没有办法解决这个问题。你的类foo
是正确的。错误消息解释了这一切。 foo
不继承PictureBox
。如果foo
是某种图片框,则实现PictureBox
类而不是Control
。
举一个现实生活中的例子:
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.
}
}
<小时 />我想展示的是与a square is a rectangle, but a rectangle isn't always a square
相同的内容:
interface IRectangle { }
interface ISquare : IRectangle { }
评论中的安东尼和回答中的科尔都向您展示了例外的来源。至于如何修复它,我不确定我是否完全得到了你打算做的事情,但是看看你试图调用的方法的名称,以及你说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();