繁体   English   中英

创建通用类型的实例

[英]Create Instance of Generic Type

我想构建一个通用的Observable集合,该集合将值从数据库加载到其项中。 为了将值分配给项目的属性,我想创建对象的实例。 但是,我收到了Activator.CreateInstance命令的错误:“'T'是一种类型,在给定的上下文中无效”

public class ListBase<T> : ObservableCollection<T>
{
    private DbTable tab;


    public ListBase()
    {
        tab = DbCatalog.Tables.Where(x => x.ModelObjectType == typeof(T).Name).First();

        LoadValues();
    }

    private void LoadValues()
    {

        foreach (DataRow r in tab.GetValues.Rows)
        {
            T o = (T)Activator.CreateInstance(T); //<-- The (T) at the end throws the error

            var p = o.GetType().GetProperty("xyz_property");

            if (p.PropertyType == typeof(int))
            {
                p.SetValue(o, Convert.ToInt32(r["xyz_fromDB"]));
            }

        }
    }

}

无需使用Activator.CreateInstance ,正确的方法是像对任何对象一样对其进行new -但这需要一个new约束

public class ListBase<T> : ObservableCollection<T> where T : new()
{

}

现在,您只需执行以下操作:

T o = new T();

您应该使用: CreateInstance(typeof(T))typeof返回将起作用的System.Type类的对象。

在C#中,“通用”类型TSystem.Type实例之间存在差异。 Activator.CreateInstance需要后者。


编辑:通常应该使用DavidG的方法 ,它更干净。 您可以在以下情况下使用Activator

  • 由于某种原因,您无法添加通用约束。
  • 您想将参数传递给构造函数。 new()约束表示无参数构造函数,使用Activator 可以传递参数。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM