我想构建一个通用的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"]));
}
}
}
}
答案 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
的对象,该对象将起作用。
“通用”类型T
与System.Type
实例之间的C#存在差异。 Activator.CreateInstance需要后者。
编辑:您通常应该使用DavidG's method,它更清晰。您可以在以下时间使用Activator
:
new()
约束意味着无参数构造函数,{em> 可以