C#和#x27;通用';类型问题

C#和#x27;通用';类型问题,c#,generics,image,C#,Generics,Image,C#问题(.net 3.5)。我有一个类ImageData,它有一个字段ushort[,]像素。我正在处理专有的图像格式。ImageData类获取构造函数中的文件位置,然后打开文件扩展名以确定如何解码。在一些图像文件中,标题中有一个“位深度”字段。在我解码标题后,我将像素值读入“像素”数组。到目前为止,我还没有超过16个基点,所以我没事。但如果我有32个基点呢 我想做的是在运行时确定像素的类型。我想在我从报头读取位深度之后,在我将像素数据复制到内存之前,执行此操作。有什么想法吗?我想说的是不要在

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


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

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

让解码函数返回数组类型的对象,它是所有数组的基类。然后,关心该类型的人可以执行“if(a是ushort[,])”等操作,如果他们想要遍历像素的话。如果这样做,则需要在ImageData中分配数组,而不是相反

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


问题的根源在于,您不知道如何确定所需的输出格式。您需要首先弄清楚这一点,然后是程序语法。

为了简化您的问题,您希望能够有一个类,它有时有一个ushort[,]pixels字段(每像素16位),有时有一个uint32[,]pixels字段(每像素32位)。有两种不同的方法可以实现这一点

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

我认为更好的解决方案是将ImageData分为16位和32位类,并使用工厂方法创建实例。例如,ImageData是基类,ImageData16bpp和ImageData32bpp是子类,静态方法ImageData。Create(字符串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;
}