动态创建一个对象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态创建一个对象相关的知识,希望对你有一定的参考价值。

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

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

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

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

答案

此链接应该有所帮助:

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));
}
另一答案

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

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

T CreateType<T>() where T : new()
{
   return new T();
}
另一答案
public static T GetInstance<T>(params object[] args)
{
     return (T)Activator.CreateInstance(typeof(T), args);
}

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

另一答案

你想使用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();
    }
}
另一答案

这是我写的一个函数,它使用反射克隆类型为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;
    }

我希望这可以帮助别人。

遗憾

另一答案

假设您有以下类型:

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

以上是关于动态创建一个对象的主要内容,如果未能解决你的问题,请参考以下文章

你如何在片段中膨胀动态创建的对象?

在android中动态创建选项卡并使用传入的参数加载片段

为动态创建的 Android 片段提供自定义属性值

RecyclerView holder中的Android Google Maps动态片段

在动态 viewpager 片段中创建 recyclerviews

动态 Rstudio 代码片段