C#'通用'类型问题

时间:2008-09-18 22:15:16

标签: c# generics image

C#问题(.net 3.5)。我有一个类ImageData,它有一个字段ushort [,]像素。我正在处理专有的图像格式。 ImageData类在构造函数中获取文件位置,然后打开文件扩展名以确定如何解码。在几个图像文件中,标题中有一个“位深度”字段。在解码标头后,我将像素值读入“像素”数组。到目前为止,我没有超过16bpp,所以我没事。但是,如果我有32bpp怎么办?

我想要做的是在运行时确定像素类型。我想在读取标题的位深度之后以及将像素数据复制到内存之前执行此操作。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

我想说不要在construtor中做那项工作 - 在我看来,构造函数不应该做那么多工作。使用读取文件的工厂方法来确定位深度,然后让它构造类的正确泛型变量并返回它。

答案 1 :(得分:2)

要简化你的问题,你希望有一个类有一个 ushort [,]像素字段(每像素16位)和一个 uint32 [,一些其他时间的像素字段(每像素32位)。有几种不同的方法可以实现这一目标。

你可以通过制作一个具有32位和16位子类的Pixel类来为ushort / uint32创建替换,从而覆盖了wazoo上的各种运算符,但是这会产生很多开销,很难做到正确甚至更难以确定它是否正确。或者,您可以为像素数据创建代理类(包含ushort [,]或uint32 [,]数组,并且所有必需的访问器都有用)。缺点是你可能会在ImageData类中得到很多特殊情况代码,它们以某种方式执行,具体取决于某些16位/ 32位模式标志。

我认为更好的解决方案是将ImageData子类化为16位和32位类,并使用工厂方法创建实例。例如。 ImageData是基类,ImageData16bpp和ImageData32bpp是子类,静态方法ImageData.Create(string imageFilename)是根据头数据创建ImageData16bpp或ImageData32bpp的工厂方法。例如:

public static ImageData Create(string imageFilename)
{
   // ...
   ImageDataHeader imageHeader = ParseHeader(imageFilename);
   ImageData newImageData;
   if (imageHeader.bpp == 32)
   {
      newImageData = new ImageData32(imageFilename, imageHeader);
   }
   else
   {
      newImageData = new ImageData16(imageFilename, imageHeader);
   }
   // ...
   return newImageData;
}

答案 2 :(得分:0)

让解码函数返回Array类型的对象,这是所有数组的基类。那么关心这种类型的人可以做“if(a is ushort [,])”等等,如果他们想要通过像素。如果你这样做,你需要在ImageData中分配数组,而不是相反。

或者,调用者可能知道他们希望您使用哪种像素数组。即使它是8bpp或16bpp的图像,如果你将它解码为32bpp的屏幕,你需要使用uint而不是ushort。因此,您可以编写一个ImageData函数,该函数将解码为任何类型的整数。

问题的根源在于您不知道如何确定所需的输出格式。你需要先弄明白,程序语法是第二位。