创建泛型类型的实例

时间:2017-12-23 11:33:45

标签: c#

我想构建一个通用的Observable Collection,它将数据库中的值加载到其项目中。为了将值分配给项的属性,我想创建对象的实例。但是,我收到了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"]));
            }

        }
    }

}

2 个答案:

答案 0 :(得分:7)

没有必要使用Activator.CreateInstance,正确的方法是new就像你对任何对象一样 - 但这需要new constraint:< / p>

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

}

现在你可以这样做:

T o = new T();

答案 1 :(得分:1)

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

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

编辑:您通常应该使用DavidG's method,它更清晰。您可以在以下时间使用Activator

  • 由于某种原因,您无法添加通用约束。
  • 您想要将参数传递给构造函数。 (new()约束意味着无参数构造函数,{em> 可以
  • 传递参​​数。{/ li>