C#-如何检查是否需要构造类型的对象?

C#-如何检查是否需要构造类型的对象?,c#,arrays,object,reflection,C#,Arrays,Object,Reflection,(如果重复,我很抱歉,我不确定是否要检查nullable或primitives或其他内容) 我正在创建变量类型的对象数组。它可以是int、string、Point或MyCustomClass(虽然可能没有枚举,但它们与int相同,对吗?)。 输入:数组元素的类型 黑框:检查是否需要构造类型。创建数组,如果需要构造,则创建每个元素(使用默认值,因为此时它们并不重要)。构造函数必须是无参数(->失败函数),但将字符串视为特殊类型 输出:对象(其运行时类型为int[]或string[]或Point[

(如果重复,我很抱歉,我不确定是否要检查nullable或primitives或其他内容)

我正在创建变量类型的对象数组。它可以是
int
string
Point
MyCustomClass
(虽然可能没有枚举,但它们与
int
相同,对吗?)。
输入:数组元素的类型

黑框:检查是否需要构造类型。创建数组,如果需要构造,则创建每个元素(使用默认值,因为此时它们并不重要)。构造函数必须是无参数(->失败函数),但将字符串视为特殊类型

输出:
对象
(其运行时类型为
int[]
string[]
Point[]
等)
我面临的问题是,我创建了一个满是
null
的数组。原语和结构运行良好,我得到的
int[]
没有问题,但类会导致“
null[]
”。
到目前为止我所做的(不确定是否全部抓到):

public object createArray(类型arrayElementType,int-arrayLength)
{
Array a=Array.CreateInstance(arrayElementType,arrayLength);
if(!arrayElementType.IsPrimitive)//正确答案是:if(!arrayElementType.IsValueType)
对于(int j=0;j
这里的困难在于创建实例;很容易确定是否将在数组分配上创建实例:只需检查默认(T)值。但是我们如何手动创建一个实例呢?如果你的类有,比如说,五个构造函数呢? 在下面的代码中,我创建了一个实例,如果它的类有一个默认构造函数,它是公共的,并且没有参数

publicstatict[]CreateArray(int-size){
如果(尺寸<0)
抛出新ArgumentOutOfRangeException(“大小”);
T[]结果=新的T[尺寸];
//您可以在此处放置任何特殊情况,例如,如果您想要空字符串而不是空字符串
//取消对exerp的注释:
//if(typeof(T)=typeof(String)){
//for(int i=0;i
测试用例:

  // int is a structore, its default value is 0, so i = [0, 0, 0, 0, 0]
  int[] i = CreateArray<int>(5);

  // String has no String() constructor, so s[] = [null, null, null, null, null]
  String[] s = CreateArray<String>(5); 

  // Button has Button() constructor, so b[] contains buttons 
  Button[] b = CreateArray<Button>(5);
//int是一个structore,它的默认值是0,所以i=[0,0,0,0,0]
int[]i=CreateArray(5);
//String没有String()构造函数,因此s[]=[null,null,null,null,null]
字符串[]s=CreateArray(5);
//Button具有Button()构造函数,因此b[]包含按钮
按钮[]b=CreateArray(5);

这里的困难在于创建实例;很容易确定是否将在数组分配上创建实例:只需检查默认(T)值。但是我们如何手动创建一个实例呢?如果你的类有,比如说,五个构造函数呢? 在下面的代码中,我创建了一个实例,如果它的类有一个默认构造函数,它是公共的,并且没有参数

publicstatict[]CreateArray(int-size){
如果(尺寸<0)
抛出新ArgumentOutOfRangeException(“大小”);
T[]结果=新的T[尺寸];
//您可以在此处放置任何特殊情况,例如,如果您想要空字符串而不是空字符串
//取消对exerp的注释:
//if(typeof(T)=typeof(String)){
//for(int i=0;i
测试用例:

  // int is a structore, its default value is 0, so i = [0, 0, 0, 0, 0]
  int[] i = CreateArray<int>(5);

  // String has no String() constructor, so s[] = [null, null, null, null, null]
  String[] s = CreateArray<String>(5); 

  // Button has Button() constructor, so b[] contains buttons 
  Button[] b = CreateArray<Button>(5);
//int是一个structore,它的默认值是0,所以i=[0,0,0,0,0]
int[]i=CreateArray(5);
//String没有String()构造函数,因此s[]=[null,null,null,null,null]
字符串[]s=CreateArray(5);
//Button具有Button()构造函数,因此b[]包含按钮
按钮[]b=CreateArray(5);

您可以尝试以下代码

public class TypeClass
{
    public static T[] CreateArray<T>(int arrayLength) // using T[] would save you from type-casting
        where T : new()     // <-- Constrain to types with a default constructor
    {
        T[] t = new T[arrayLength];
        for (int j = 0; j < arrayLength; j++)
            t[j] = new T();
        return t;
    }
}

public class MyClass
{
    static void Main(string[] args)
    {
        int [] intArray = TypeClass.CreateArray<int>(5);
        string [] stringArray = TypeClass.CreateArray<string>(5);
        Point [] pointArray = TypeClass.CreateArray<Point>(5);
        MyCustomClass [] myCustomClassArray = TypeClass.CreateArray<MyCustomClass>(5);
    }
}
公共类TypeClass
{
公共静态T[]CreateArray(int arrayLength)//使用T[]可以避免类型转换

其中T:new()//您可以尝试以下代码

public class TypeClass
{
    public static T[] CreateArray<T>(int arrayLength) // using T[] would save you from type-casting
        where T : new()     // <-- Constrain to types with a default constructor
    {
        T[] t = new T[arrayLength];
        for (int j = 0; j < arrayLength; j++)
            t[j] = new T();
        return t;
    }
}

public class MyClass
{
    static void Main(string[] args)
    {
        int [] intArray = TypeClass.CreateArray<int>(5);
        string [] stringArray = TypeClass.CreateArray<string>(5);
        Point [] pointArray = TypeClass.CreateArray<Point>(5);
        MyCustomClass [] myCustomClassArray = TypeClass.CreateArray<MyCustomClass>(5);
    }
}
公共类TypeClass
{
公共静态T[]CreateArray(int arrayLength)//使用T[]可以避免类型转换

其中T:new()//我们真的不清楚您想要实现什么。让我们以
string
为例-您显然想要一个非空字符串引用数组,但这些字符串的内容应该是什么?@JonSkeet Content不重要。它们不能是空的。您能展示一些关于这一点的代码吗?如果您告诉我们您的计划,也许可以若要使用此阵列,我们可能会提供更好的建议。目前,这感觉像是一个@mini me-虽然人们继续尝试做一些奇怪或奇怪的事情,但却没有提供上下文,请他们停下来,后退一步,画一幅更大的图,并且可能不会最终建立一个Rube Goldberg解决方案来解决可能出现的问题,这总是值得的这是一个可能更简单地解决的问题