在C#中动态创建一个类型数组

9
在C#中,我需要能够根据作为字符串传递到函数的逗号分隔的数据类型列表,在运行时创建Type对象数组。基本上,这是我要完成的内容:
// create array of types
Type[] paramTypes = { typeof(uint), typeof(string), typeof(string), typeof(uint) };

但是我需要能够像这样调用我的函数:
MyFunction("uint, string, string, uint");

我希望你能够根据传入的字符串动态地生成数组。这是我的第一次尝试:

void MyFunction(string dataTypes)
{
    //out or in parameters of your function.   
    char[] charSeparators = new char[] {',', ' '};
    string[] types = dataTypes.Split(charSeparators,
                        stringSplitOptions.RemoveEmptyEntries);

    // create a list of data types for each argument
    List<Type> listTypes = new List<Type>();
    foreach (string t in types)
    {
        listTypes.Add(Type.GetType(t)); 
    }
    // convert the list to an array
    Type [] paramTypes = listTypes.ToArray<Type>();

}

这段代码只是创建了一个System.Type类型的null对象数组。我相信问题就出在这里:

listTypes.Add(Type.GetType(t));

为什么这个语法不起作用?建议如下:

1
你可能会发现这个C#别名表在switch语句或类似情况下非常有用。http://msdn.microsoft.com/en-us/library/ya5y69ds.aspx - Ani
除了程序集名称问题,考虑使用重载版本的 Type.GetType,忽略大小写。 - Tim Schmelter
5个回答

5

传入 System.StringSystem.Int32 而不是 stringint

"string" 只是 System.String 的简写。 Type.GetType 不接受类型的简写符号。


5
问题在于.NET中没有uintstring类型。它们是C#类型别名,对应实际的System.UInt32System.String类型。因此,您应该像这样调用您的函数:
MyFunction("System.UInt32, System.String, System.String, System.UInt32");

4

对于每个类型,包括命名空间,请使用完整的名称。像这样:

class Program
{
    static void Main(string[] args)
    {
        var dataTypes = "System.UInt32, System.String, System.String, System.UInt32";

        //out or in parameters of your function.   
        char[] charSeparators = new char[] { ',', ' ' };
        string[] types = dataTypes.Split(charSeparators,
                            StringSplitOptions.RemoveEmptyEntries);

        // create a list of data types for each argument
        List<Type> listTypes = new List<Type>();
        foreach (string t in types)
        {
            listTypes.Add(Type.GetType(t));
        }
        // convert the list to an array
        Type[] paramTypes = listTypes.ToArray<Type>();
    }
}

2

这段代码无法正常工作,因为uint, string等并不是 .net 类型的官方名称。它们只是 C# 中对应的 System.UInt32, System.String 等类型的别名。如果你想要动态创建类型,就必须使用 .net 的类型名称。


0

我知道这已经过时了,但这是我破解的方法:

private void Build_Files_DT()
    {
        String[] CLM_Header_Name_Array; Object[] Data_Type_Array;
        CLM_Header_Name_Array = new String[] { "File_Name_CLM", "Created_Date_Time_CLM", "Log_Read_CLM" };
        Data_Type_Array = new Object[] { typeof(System.String), typeof(System.DateTime), typeof(System.Boolean) };
        DT = new DataTable();
        Build_DT(DT, CLM_Header_Name_Array, Data_Type_Array);
    }

private void Build_DT(DataTable DT,  String[] CLM_Header_Name_Array, Object[] Data_Type_Array)
    {

        for (int i = 0; i < CLM_Header_Name_Array.Length; i++)
        {
            DT.Columns.Add(new DataColumn(CLM_Header_Name_Array[i], (Type)Data_Type_Array[i]));
        }
    }//Build_DT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接