我的数据库中有一个表,用于管理应用程序中的关系。它的本质是非常基本的 - parentType,parentId,childType,childId ...... all as int。之前我已经完成了这个设置,但是当我有6个不同的表我试图链接时,我使用了一个开关/案例设置。现在我有30个表,我正在尝试这样做,我希望能够做到这一点,而无需在我的switch命令中写入30个案例条目。
有没有办法可以使用字符串引用.Net类?我知道这是无效的(因为我尝试了几种变体):
Type t = Type.GetType("WebCore.Models.Page");
object page = new t();
我知道如何获取对象的类型,但如何动态使用它来创建新对象?
答案 0 :(得分:56)
此链接应该有所帮助:
http://msdn.microsoft.com/en-us/library/system.activator.createinstance(VS.71).aspx
Activator.CreateInstance将创建指定类型的实例。
你可以用这样的通用方法包装它:
public T GetInstance<T>(string type)
{
return (T)Activator.CreateInstance(Type.GetType(type));
}
答案 1 :(得分:12)
如果调用者知道类型,则比使用Activator.CreateInstance更好,更快:您可以在方法上使用泛型约束来指定它具有默认的无参数构造函数。
这样做是类型安全的,不需要反射。
T CreateType<T>() where T : new()
{
return new T();
}
答案 2 :(得分:10)
public static T GetInstance<T>(params object[] args)
{
return (T)Activator.CreateInstance(typeof(T), args);
}
我会使用 Activator.CreateInstance()而不是强制转换,因为Activator有一个泛型的构造函数。
答案 3 :(得分:9)
以下是其工作原理的示例:
using System;
using System.Runtime.Remoting;
class Program
{
static void Main()
{
ObjectHandle o = Activator.CreateInstance("mscorlib.dll", "System.Int32");
Int32 i = (Int32)o.Unwrap();
}
}
答案 4 :(得分:1)
这是我编写的一个函数,它使用反射克隆类型为T的记录。 这是一个非常简单的实现,我没有处理复杂类型等。
public static T Clone<T>(T original)
{
T newObject = (T)Activator.CreateInstance(original.GetType());
foreach (var prop in original.GetType().GetProperties())
{
prop.SetValue(newObject, prop.GetValue(original));
}
return newObject;
}
我希望这可以帮助别人。
阿萨弗
答案 5 :(得分:0)
假设您有以下类型:
public class Counter<T>
{
public T Value { get; set; }
}
并具有该类型的程序集限定名称,您可以按以下方式构造它:
string typeName = typeof(Counter<>).AssemblyQualifiedName;
Type t = Type.GetType(typeName);
Counter<int> counter =
(Counter<int>)Activator.CreateInstance(
t.MakeGenericType(typeof(int)));
counter.Value++;
Console.WriteLine(counter.Value);