A calling constructor with a generic type other than a class is created using

I have this problem, which I hope is a simple solution. I have the following class (extract) and I would like to avoid creating public myImage(myImage<int> image) , public myImage(myImage<float> image) , public myImage(myImage<double> image) and possible other options (e.g. , bool).

 class myImage<T> where T : struct { private int width; private int height; private T[] img; // constructor: allocate new image public myImage(int Width, int Height) { img = new T[Width*Height]; width = Width; height = Height; } public myImage(myImage<byte> image) { // allocate space for new width = image.Width; height = image.Height; img = new T[width * height]; if (typeof(T) == typeof(byte)) { // in and out = same type? use block copy Buffer.BlockCopy(image.Image, 0, img, 0, width * height * Marshal.SizeOf(typeof(T))); } else { // else copy image element by element for (int counter = 0; counter < width * height; counter++) img[counter] = (T)Convert.ChangeType(image[counter], typeof(T)); } } public int Width { get { return width; } } public int Height { get { return height; } } public T[] Image { get { return img; } } public Object this[int index] { get { return img[index]; } set { img[index] = (T)Convert.ChangeType(value, typeof(T)); } } } 

I would use it as follows:

 myImage<byte> img = new myImage<byte>(100,200); // create byte image myImage<double> img2 = new myImage<double>(img); // create double-img2 from byte-img myImage<int> img3 = new myImage<int>(img2); // or int-img3 from double-img2 

So, do I need to create methods for bytes, int, float, double or can 1 method to do all this?

+4
source share
2 answers

You cannot use a generic argument in contructor, but you can define a static method as follows:

 class myImage<T> where T : struct { public static myImage<T> FromImage<X>(myImage<X> image) where X : struct { // create the object and return it... } } 

and then name it like

 myImage<double> img2 = myImage<double>.FromImage<byte>(img); 
+4
source

Your constructor cannot take an additional generic type from the class itself, but you can create some static factory methods that can take extra types:

 class myImage<T> where T : struct { // ... public static myImage<T> CreateFrom<TOther>(myImage<TOther> image) where TOther : struct { // allocate space for new width = image.Width; height = image.Height; img = new T[width * height]; if (typeof(T) == typeof(byte)) { // in and out = same type? use block copy Buffer.BlockCopy(image.Image, 0, img, 0, width * height * Marshal.SizeOf(typeof(T))); } else { // else copy image element by element for (int counter = 0; counter < width * height; counter++) img[counter] = (T)Convert.ChangeType(image[counter], typeof(T)); } } } 

What could be called like this:

 myImage<double> img2 = myImage<double>.CreateFrom(img); // create double-img2 from byte-img myImage<int> img3 = myImage<int>.CreateFrom(img2); // or int-img3 from double-img2 
+2
source

All Articles