我正在尝试使用方法初始化新创建的空数组。以下示例。 这是我想要创建的代码的结构。
var v = exClass[5,5];
v.ExtensionMethodThatWillInitilize();
我想要的ExtensionMethodThatWIllInitilize要做的是:
for(int y = 0 ; y < exClass.getLength(0); y++ ) {
for(int x = 0 ; x < exClass.getLength(1); x++ ) {
v[y,x] = new instanceObject();
}}
所以我提出了以下代码......
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var oldEx = new ExClass[10, 10];
var newEx = oldEx.init();
}
}
public class ExClass
{
public string exString
public ExClass() {
exString = " I AM NEW! YES! ";
}
}
public static class tools
{
static public ExClass[,] init(this ExClass[,] start)
{
var newArray = new ExClass[start.GetLength(0), start.GetLength(1)];
for (int y = 0; y < start.GetLength(0); y++)
{
for (int x = 0; x < start.GetLength(1); x++)
{
newArray[y, x] = new ExClass();
}
}
return newArray;
}
}
然而问题是我不知道如何修改我的init方法,以便它可以采用任何类型的数组并返回已初始化的相应数组。 我尝试使用泛型T,但我缺乏经验似乎失败了。
综述:
1)你如何想出一个能在一步中初始化空数组的方法。
2)如何确保该方法可以初始化任何类型的数组(假设数组中的元素具有不带任何参数的构造函数)
答案 0 :(得分:1)
泛型确实有用。您需要将方法声明为泛型类型。
我修改了上面的例子如下:
class Program
{
static void Main(string[] args)
{
var oldEx = new ExClass[10, 10];
var newEx = oldEx.init<ExClass>();
}
}
public class ExClass
{
public string exString = "I AM NEW";
}
public static class tools
{
static public T[,] init<T>(this T[,] start)
{
var newArray = new T[start.GetLength(0), start.GetLength(1)];
for (int y = 0; y < start.GetLength(0); y++)
{
for (int x = 0; x < start.GetLength(1); x++)
{
newArray[y, x] = Activator.CreateInstance<T>();
}
}
return newArray;
}
}
作为对以下评论的回答:
class Program
{
static void Main(string[] args)
{
var oldEx = tools.init<ExClass>(10, 10);
}
}
public class ExClass
{
public string exString = "I AM NEW";
}
public static class tools
{
static public T[,] init<T>(int x,int y)
{
var newArray = new T[x, y];
for (int i = 0; i < x; i++)
{
for (int j = 0; j < y; j++)
{
newArray[i, j] = Activator.CreateInstance<T>();
}
}
return newArray;
}
}
答案 1 :(得分:1)
查看此泛型方法,该方法使用new
通用约束:
static public void Init<T>(this T[,] array) where T : new()
{
for (int y = 0; y < array.GetLength(0); y++)
{
for (int x = 0; x < array.GetLength(1); x++)
{
array[y, x] = new T();
}
}
}
与您的代码的主要区别是:
1)方法是Init指定一个通用参数,where T : new()
约束确保我们可以调用new T();
2)我只是在原地初始化数组,而不是返回一个新的初始化数组。似乎更符合逻辑。如果你愿意,你可以使用原始版本,但我不明白为什么你需要。