我有以下代码
//^process a aquery and return DataTable
DataTable d t= dbConnect.ProcessQuery(strquery);
Type t = dt.Columns[0].DataType.GetType();
如何创建t
将接收的类型的对象dt[0][..]
?
我知道那dt.Rows[][]
将是类型t
我需要创建类型的 anagrammatically 变量t
我有以下代码
//^process a aquery and return DataTable
DataTable d t= dbConnect.ProcessQuery(strquery);
Type t = dt.Columns[0].DataType.GetType();
如何创建t
将接收的类型的对象dt[0][..]
?
我知道那dt.Rows[][]
将是类型t
我需要创建类型的 anagrammatically 变量t
第一步是检索您要创建的实际类型。最有可能的是,类型的名称作为字符串存储在数据库中。所以你打电话
var typeName = "System.Int32";
var type = System.Type.GetType(typeName);
现在您有了要实例化的实际类型,请调用
var obj = System.Activator.CreateInstance(type);
在大多数情况下,您将为在每种情况下使用的所有类型都有一个通用的基本接口:
var i = (IFormattable)obj;
现在您可以调用接口上的方法,它们将在实际类型上执行。
Console.WriteLine(i.ToString("0", System.Globalization.CultureInfo.InvariantCulture));
Knaģis 已经提供了适当的答案,但我想指出这行代码是不正确的:
Type T =dt.Columns[0].DataType.GetType();
这将始终返回Type
, not string
,int
等。那是因为 Type of DataType
is Type
。改用这个:
Type T =dt.Columns[0].DataType;
此外,您正在使用泛型类型的命名约定。虽然在第一次阅读时有点混乱,但它并没有什么“错误”。请注意,泛型类型和变量之间存在差异。例如,在您的问题中给出代码,您将无法使用此代码:
var x = new List<T>;
在您的代码上下文中,T
是一个变量,而不是泛型类型,因此上述内容会导致编译时错误。
See this question for more information:
Generics in C#, using type of a variable as parameter