在运行时期间使用类型对象创建实例

时间:2012-11-06 15:48:05

标签: c# reflection types initialization

我有以下代码

//^process a aquery and return DataTable
DataTable d t= dbConnect.ProcessQuery(strquery);
Type t = dt.Columns[0].DataType.GetType();

如何创建将收到t的<{1}}类型的对象?

我知道dt[0][..]的类型为dt.Rows[][]

我需要创建类型为t

的变量

2 个答案:

答案 0 :(得分:17)

第一步是检索您要创建的实际类型。最有可能的是,类型的名称作为String存储在数据库中。所以你打电话

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

文档:http://msdn.microsoft.com/en-us/library/wccyzw83.aspx

答案 1 :(得分:2)

Knaģis已经提供了适当的答案,但我想指出这行代码不正确:

Type T =dt.Columns[0].DataType.GetType();

这将始终返回Type,而不是stringint等。这是因为DataType的类型为Type。请改用:

Type T =dt.Columns[0].DataType;

此外,您正在使用泛型类型的命名约定。虽然在第一次阅读时有点令人困惑,但它并没有“错误”。请注意,泛型类型和变量之间存在差异。例如,在您的问题中提供代码,您就可以使用此代码:

var x = new List<T>;

在代码的上下文中,T是一个变量,而不是泛型类型,因此上面会导致编译时错误。

有关更多信息,请参阅此问题:
Generics in C#, using type of a variable as parameter