[英]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#中,“通用”类型T
和System.Type
实例之间存在差异。 Activator.CreateInstance需要后者。
编辑:通常应该使用DavidG的方法 ,它更干净。 您可以在以下情况下使用Activator
:
new()
约束表示无参数构造函数,使用Activator
可以传递参数。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.