在 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 中没有 uint
和 string
类型。这些是实际 System.UInt32 和 System.String 类型的 C# 类型别名。所以你应该这样调用你的函数:
MyFunction("System.UInt32, System.String, System.String, System.UInt32");
【讨论】:
【参考方案2】:传入System.String
、System.Int32
而不是string
和int
。
"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】:它不起作用,因为uint
、string
等不是 .net 类型的正式名称。它们是 System.UInt32
、System.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# 中动态创建类型数组的主要内容,如果未能解决你的问题,请参考以下文章