我想构建一个通用的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"]));
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
没有必要使用Activator.CreateInstance,正确的方法是new像对待任何对象一样 - 但这需要一个new约束:
public class ListBase<T> : ObservableCollection<T> where T : new()
{
}
Run Code Online (Sandbox Code Playgroud)
现在你可以简单地这样做:
T o = new T();
Run Code Online (Sandbox Code Playgroud)