调用与创建类不同的泛型类型的构造函数
我有这个问题,我希望这是一个简单的解决方案。我有以下课程(摘录),我想避免必须制作 public myImage(myImage
, public myImage(myImage
、public myImage(myImage
以及可能的其他变体(如 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 个方法完成这一切?
I have this problem which I hope is a simple solution to. I have the following class (extract) and I'd like to avoid having to make public myImage(myImage<int> image)
, public myImage(myImage<float> image)
, public myImage(myImage<double> image)
and possible other variants as well (like 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'd use it like this:
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 have to create methods for byte, int, float, double or can 1 method do it all?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您不能在构造函数中使用通用参数,但您可以像这样定义一个静态方法:
然后像这样调用它
You cannot use a generic argument in the contructor, but you could define a static method like this:
and then call it like
您的构造函数不能从类本身获取额外的泛型类型,但您可以创建一些静态工厂方法,这些方法可以获取额外的类型:
然后可以像这样调用:
Your constructor cannot take an additional generic type from the class itself, but you can create some static factory methods, which can take additional types:
Which could then be called like: