在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));
关于为什么这种语法无法解决问题的建议?
答案 0 :(得分:6)
传递System.String
,System.Int32
代替string
和int
。
“string”只是System.String的简写。 Type.GetType
不会接受类型的简写表示法。
答案 1 :(得分:5)
问题是.NET中没有uint
和string
类型。这些是实际System.UInt32和System.String类型的C#类型别名。所以你应该像这样调用你的函数:
MyFunction("System.UInt32, System.String, System.String, System.UInt32");
答案 2 :(得分: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>();
}
}
答案 3 :(得分:2)
它不起作用,因为uint
,string
等不是.net类型的官方名称。它们是System.UInt32
,System.String
等的C#别名。如果要像这样动态创建类型,则需要使用.net类型名称。
答案 4 :(得分: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