我正在创建一个类来帮助修改 GUI 中的图像。图像可以位于 PictureBox
或 DataGridViewImageCell
中。该类将存储所有可以修改的图像的列表。该类的每个实例都将使用 PictureBox
或 DataGridViewImageCells
,但不能同时使用两者。
有没有办法处理这两个输入?例如,它们之间是否有一些公共(public)接口(interface),或者是否有一种方法将它们转换为某个公共(public)父类?
最佳答案
好吧,你总是可以将它们视为 object
,但我建议您的类专门为这两种类型提供两个重载:
class MyClass
{
public void AddImage(PictureBox image)
{
}
public void AddImage(DataGridViewImageCell image)
{
}
}
如何在内部存储它取决于您。也许你有一个List<object>
您将其转换到/转换出,或者您可能维护两个单独的列表,每个列表对应一种类型,或者您可能只是添加每个 image
到包含对象的子集合。
对于共享类,我从MSDN上相信它们不共享除Object
之外的基类。所以你必须坚持这一点或者用你自己的包含类包装它们。
编辑:这是一种通过包装接口(interface)和工厂来处理它的更全面的方法。
首先,定义一个具有基于共享的类型的接口(interface)(在本例中为 object
),您可以使用它来传递图像:
public interface IImageWrapper
{
object RawImage { get; }
}
public class PictureBoxImageWrapper : IImageWrapper
{
public object RawImage { get; private set; }
public PictureBoxMyImage(PictureBox image)
{
this.RawImage = image;
}
}
public class DataGridViewImageCellImageWrapper : IImageWrapper
{
public object RawImage { get; private set; }
public DataGridViewImageCellImageWrapper(DataGridViewImageCell image)
{
this.RawImage = image;
}
}
然后,用户 API 的一个简单工厂可以使用 包装图像, 具有编译时安全性,可以严格支持哪些图像类型:
public class ImageWrapperFactory
{
public IImageWrapper Create(PictureBox image)
{
return new PictureBoxImageWrapper(image);
}
public IImageWrapper Create(DataGridViewImageCell image)
{
return new DataGridViewImageCellImageWrapper(image);
}
}
然后你的显示类或 View 可以接收这些IImageWrapper
对象并将它们转换为可用类型:
public class MyDisplayClass
{
private List<IImageWrapper> Images = new List<IImageWrapper>();
public void AddImage(IImageWrapper image)
{
Images.Add(image);
}
private void AddImageToContainer(IImageWrapper image)
{
object rawImage = image.RawImage;
if (rawImage is PictureBox)
AddImageToContainerImpl((PictureBox)rawImage);
else if (rawImage is DataGridViewImageCell)
AddImageToContainerImpl((DataGridViewImageCell)rawImage);
else
throw new NotSupportedException();
}
private void AddImageToContainerImpl(PictureBox image)
{
//add to container
}
private void AddImageToContainerImpl(DataGridViewImageCell image)
{
//add to container
}
}
一些示例用法:
PictureBox myImage = ...
MyDisplayClass myView = ...
myView.AddImage(ImageWrapperFactory.Create(myImage));
事实上,图像的基础类型并没有被强制执行。太。如果您愿意,您可以更新工厂以返回强类型 IImageWrapper
对象为 PictureBoxImageWrapper
反过来,让显示类针对它支持的类进行强类型化,但这有点违背了目的(您也可以针对 PictureBox
/DataGridViewImageCell
进行强类型化,就像我的第一个答案中那样。
编辑:另一种方法是为您的“工厂”利用隐式运算符。这样,您的 API 只是“传递”原始图像对象,如果它们受支持,则会找到隐式运算符。如果不是,那么您将收到编译时异常:
public sealed class ImageWrapper
{
public object RawData { get; private set; }
private ImageWrapper(object rawData)
{
this.RawData = rawData;
}
public static implicit operator ImageWrapper(PictureBox image)
{
return new ImageWrapper(image);
}
public static implicit operator ImageWrapper(DataGridViewImageCell image)
{
return new ImageWrapper(image);
}
}
PictureBox myImage = ...
ImageControl unsupportedImage = ...
MyDisplayClass myView = ...
myView.AddImage(myImage); //OK!
myView.AddImage(unsupportedImage);// compile error!
关于c# - 同时接收 PictureBox 和 DataGridViewImageCell 的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14462919/