C# 动态创建<;的对象;类型>;

C# 动态创建<;的对象;类型>;,c#,.net,dynamic,C#,.net,Dynamic,我的数据库中有一个表,用于管理应用程序之间的关系。它的本质非常基本-parentType,parentId,childType,childId。。。都是ints。我以前做过这个设置,但是当我尝试链接6个不同的表时,我使用了开关/机箱设置。现在我有30个表,我正在尝试使用这些表,我希望能够做到这一点,而不必在switch命令中写入30个case条目 有没有一种方法可以使用字符串引用.Net类?我知道这是无效的(因为我尝试了几种不同的方法): 我知道如何获取对象的类型,但如何在运行中使用该类型来创建

我的数据库中有一个表,用于管理应用程序之间的关系。它的本质非常基本-parentType,parentId,childType,childId。。。都是ints。我以前做过这个设置,但是当我尝试链接6个不同的表时,我使用了开关/机箱设置。现在我有30个表,我正在尝试使用这些表,我希望能够做到这一点,而不必在switch命令中写入30个case条目

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


我知道如何获取对象的类型,但如何在运行中使用该类型来创建新对象?

此链接应有帮助:

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

您可以将其包装在一个通用方法中,如下所示:

public T GetInstance<T>(string type)
{
    return (T)Activator.CreateInstance(Type.GetType(type));
}
public T GetInstance(字符串类型)
{
return(T)Activator.CreateInstance(Type.GetType(Type));
}
您要使用的

以下是它的工作原理示例:

using System;
using System.Runtime.Remoting;

class Program
{
    static void Main()
    {
        ObjectHandle o = Activator.CreateInstance("mscorlib.dll", "System.Int32");

        Int32 i = (Int32)o.Unwrap();
    }
}

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

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

T CreateType<T>() where T : new()
{
   return new T();
}
T CreateType(),其中T:new()
{
返回新的T();
}

假设您有以下类型:

public class Counter<T>
{
  public T Value { get; set; }
}
公共类计数器
{
公共T值{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);
string typeName=typeof(计数器).AssemblyQualifiedName;
Type t=Type.GetType(typeName);
计数器=
(计数器)Activator.CreateInstance(
t、 MakeGenericType(typeof(int));
计数器.Value++;
控制台写入线(计数器值);
公共静态GetInstance(params对象[]args)
{
return(T)Activator.CreateInstance(typeof(T),args);
}

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

我编写了一个函数,它使用反射克隆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;
    }
公共静态T克隆(T原始)
{
T newObject=(T)Activator.CreateInstance(original.GetType());
foreach(原始.GetType().GetProperties()中的var prop)
{
prop.SetValue(newObject,prop.GetValue(original));
}
返回newObject;
}
我希望这能帮助别人


Assaf

它不需要在源代码级别进行反射-它在生成的IL中使用Activator.CreateInstance。反射是必需的,因为OP使用字符串指定以标识类型。如果包含该类型的程序集尚未加载到AppDomain中,这将不起作用。此外,为了调用该方法OP必须在编译时访问该类型-最初的问题是如何在执行时从字符串创建实例。我只是根据问题中提供的示例来回答。啊,你是对的-OP似乎确实可以访问该类型!我的错误-(-1)已删除!您的示例还需要在编译时了解类型:)
public static T GetInstance<T>(params object[] args)
{
     return (T)Activator.CreateInstance(typeof(T), args);
}
 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;
    }