dynamic创build一个<Type>的对象
我在我的数据库中有一个表,用来pipe理我的应用程序之间的关系。 它的本质是非常基本的 – parentType,parentId,childType,childId …都是整数。 我之前已经完成了这个设置,但是当我尝试链接6个不同的表格时,我使用了开关/表格设置。 现在我有30个表,我试图做到这一点,我希望能够做到这一点,而不必写在我的switch命令30个案例条目。
有没有一种方法可以使用string引用.Net类? 我知道这是无效的(因为我已经尝试了几个变化):
Type t = Type.GetType("WebCore.Models.Page"); object page = new t();
我知道如何获得一个对象的types,但我如何使用它在飞行中创build一个新的对象?
这个链接应该有帮助:
http://msdn.microsoft.com/en-us/library/system.activator.createinstance(VS.71).aspx
Activator.CreateInstance将创build指定types的实例。
你可以用这样的通用方法来包装它:
public T GetInstance<T>(string type) { return (T)Activator.CreateInstance(Type.GetType(type)); }
如果调用者知道该types,那么比使用Activator.CreateInstance更好,更快捷:您可以改为在指定具有默认无参数构造函数的方法上使用通用约束。
这样做是types安全的,不需要reflection。
T CreateType<T>() where T : new() { return new T(); }
你想使用Activator.CreateInstance
。
这是一个如何工作的例子:
using System; using System.Runtime.Remoting; class Program { static void Main() { ObjectHandle o = Activator.CreateInstance("mscorlib.dll", "System.Int32"); Int32 i = (Int32)o.Unwrap(); } }
public static T GetInstance<T>(params object[] args) { return (T)Activator.CreateInstance(typeof(T), args); }
这是我写的一个函数,它使用reflection来克隆types为T的logging。 这是一个非常简单的实现,我没有处理复杂的types等
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; }
我希望这可以帮助别人。
阿萨夫
假设你有以下types:
public class Counter<T> { public T Value { get; set; } }
并具有该types的程序集限定名称,则可以按以下方式构造它:
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);