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

Posted

技术标签:

【中文标题】在 C# 中动态创建类型数组【英文标题】:Dynamically create an array of Type in C# 【发布时间】:2011-06-09 11:51:21 【问题描述】:

在 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 类型的空对象数组。我很确定问题出在这里:

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

关于为什么这种语法不起作用的建议?

【问题讨论】:

您可能会发现此 C#-aliases 表对于 switch 语句或类似语句很有用。 msdn.microsoft.com/en-us/library/ya5y69ds.aspx 除了程序集名称问题,考虑使用忽略大小写的Type.GetType 的重载版本。 【参考方案1】:

问题在于 .NET 中没有 uintstring 类型。这些是实际 System.UInt32 和 System.String 类型的 C# 类型别名。所以你应该这样调用你的函数:

MyFunction("System.UInt32, System.String, System.String, System.UInt32");

【讨论】:

【参考方案2】:

传入System.StringSystem.Int32 而不是stringint

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

【讨论】:

【参考方案3】:

使用每个类型的全名,包括命名空间。像这样:

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

【讨论】:

【参考方案4】:

它不起作用,因为uintstring 等不是 .net 类型的正式名称。它们是 System.UInt32System.String 等的 C# 别名。如果您想像这样动态创建类型,则需要使用 .net 类型名称。

【讨论】:

【参考方案5】:

我知道这是旧的,但这就是我破解它的方法:

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

【讨论】:

以上是关于在 C# 中动态创建类型数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中使用类型和属性名称从 XML 创建动态对象?

C#创建2维数组

为动态 JSON 创建 C# 模型

如何在目标c中动态创建无符号字符类型数组

创建数组的动态数组[关闭]

如何为 c++ 的不同变量类型的结构元素创建动态数组?