当前位置:  开发笔记 > 编程语言 > 正文

动态创建<Type>的对象

如何解决《动态创建<Type>的对象》经验,为你挑选了4个好方法。

我的数据库中有一个表,用于管理我的应用程序之间的关系.它的本质是非常基本的 - parentType,parentId,childType,childId ...... all as int.之前我已经完成了这个设置,但是当我有6个不同的表我试图链接时,我使用了一个开关/案例设置.现在我有30个表,我正在尝试这样做,我希望能够这样做,而无需在我的switch命令中写入30个案例条目.

有没有办法可以使用字符串引用.Net类?我知道这是无效的(因为我尝试了几种变体):

Type t = Type.GetType("WebCore.Models.Page");
object page = new t();

我知道如何获取对象的类型,但是我如何动态使用它来创建一个新对象?



1> Jason Miesio..:

此链接应该有所帮助:

http://msdn.microsoft.com/en-us/library/system.activator.createinstance(VS.71).aspx

Activator.CreateInstance将创建指定类型的实例.

你可以用这样的泛型方法包装它:

public T GetInstance(string type)
{
    return (T)Activator.CreateInstance(Type.GetType(type));
}


另外,为了调用该方法,OP必须在编译时访问该类型 - 原始问题询问如何在执行时从字符串创建实例.
如果包含该类型的程序集尚未加载到AppDomain中,则此方法无效.

2> Judah Gabrie..:

如果调用者知道类型,则使用Activator.CreateInstance会有更好,更快的方法:您可以在方法上使用泛型约束来指定它具有默认的无参数构造函数.

这样做是类型安全的,不需要反射.

T CreateType() where T : new()
{
   return new T();
}


它不需要在源代码级别进行反射 - 它在生成的IL中使用Activator.CreateInstance.

3> 小智..:
public static T GetInstance(params object[] args)
{
     return (T)Activator.CreateInstance(typeof(T), args);
}

我会使用Activator.CreateInstance()而不是强制转换,因为Activator有一个泛型的构造函数.



4> Andrew Hare..:

你想用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();
    }
}

推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有