Вызывающий конструктор с универсальным типом, отличным от класса, создается с - PullRequest
4 голосов
/ 15 сентября 2011

У меня есть проблема, которая, я надеюсь, является простым решением. У меня есть следующий класс (выдержка), и я бы хотел избежать создания public myImage(myImage<int> image), public myImage(myImage<float> image), public myImage(myImage<double> image) и других возможных вариантов (например, 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)); }
    }
}

Я бы использовал это так:

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

Итак, мне нужно создавать методы для byte, int, float, double или 1 метод может делать все это?

Ответы [ 2 ]

4 голосов
/ 15 сентября 2011

Вы не можете использовать универсальный аргумент в конструкторе, но вы можете определить статический метод следующим образом:

class myImage<T> where T : struct {

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

и затем вызвать его как

myImage<double> img2 = myImage<double>.FromImage<byte>(img);
2 голосов
/ 15 сентября 2011

Ваш конструктор не может взять дополнительный универсальный тип из самого класса, но вы можете создать некоторые статические фабричные методы, которые могут принимать дополнительные типы:

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));
        }
    }
}

Который затем можно назвать как:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...