动态创建一个<Type>对象

53
我在数据库中有一个表,用于管理我的应用程序中的关系。这个表的性质非常基础 - parentType、parentId、childType和childId都是整数。我以前已经做过这样的设置,但当时我使用了switch/case设置,因为我需要连接6个不同的表。现在我需要连接30个表,但我不想在switch命令中编写30个case条目,有没有办法我可以使用字符串来引用.Net类?我知道这种方式不可行(因为我尝试过几种变化)。
Type t = Type.GetType("WebCore.Models.Page");
object page = new t();

我知道如何获取对象的类型,但是如何在运行时使用它来创建一个新对象呢?

6个回答

69

2
如果包含该类型的程序集尚未加载到AppDomain中,则此方法将无法正常工作。 - Andrew Hare
4
为了调用那个方法,编译时操作员必须能够访问该类型 - 最初的问题是如何从字符串在执行时创建一个实例。 - Andrew Hare
我只是根据问题中提供的示例来回答。 - Jason Miesionczek
啊,你说得对 - OP 确实可以访问该类型!我的错误 - (-1) 已删除! - Andrew Hare
您的例子需要在编译时了解类型 :) - Jason Miesionczek
显示剩余2条评论

14
public static T GetInstance<T>(params object[] args)
{
     return (T)Activator.CreateInstance(typeof(T), args);
}

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


14
如果调用方知道类型,那么比使用Activator.CreateInstance更好、更快的方法是在方法上使用泛型约束,指定它具有默认无参构造函数。
这样做是类型安全的,不需要使用反射。
T CreateType<T>() where T : new()
{
   return new T();
}

6
它不需要在源代码级别上进行反射 - 但它在生成的IL中使用Activator.CreateInstance。 - Jon Skeet
1
需要使用反射,因为 OP 指定使用字符串来识别类型。 - Jason Miesionczek

8

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

1
假设您有以下类型:
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);

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

我希望这可以帮助到某人。

Assaf


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接