在各种数据库表中,我同时拥有属性和值列。我正在使用Linq to SQL来访问数据库。
我正在编写一个方法,该方法返回一个包含从给定数据库表中检索的属性/值的字典:
private static Dictionary<string, string> GetProperties<T>(Table<T> table)
{
Dictionary<string, string> properties = new Dictionary<string, string>();
foreach (var row in table)
{
properties[row.Property]=row.Value;
}
return properties;
}
编译完成后,我得到:
Error 1 The type 'T' must be a reference type in order to use it as parameter 'TEntity' in the generic type or method 'System.Data.Linq.Table<TEntity>'
我试图在没有运气的情况下搜索此错误消息。
搜索StackOverflow时,这个问题看起来很相似,但关于参数列表:Generic List<T> as parameter on method - 尽管参数仍然不是该问题答案中的参考类型。
阅读MSDN上的C#编程指南:http://msdn.microsoft.com/en-us/library/twcad0zb(VS.80).aspx我看到他们的示例都通过引用传递参数。但是,在我的特定情况下,我无法看到如何通过引用传递,因为泛型类型仅用于指定表的泛型类型。
任何指针都会非常感激。
PS:如果我需要时间接受答案,请注意,因为此功能目前无法访问(我是盲人并使用屏幕阅读器)。
答案 0 :(得分:62)
这是因为声明Table<T>
的原因:
public sealed class Table<TEntity> : IQueryable<TEntity>,
IQueryProvider, IEnumerable<TEntity>, ITable, IQueryable, IEnumerable,
IListSource
where TEntity : class // <-- T must be a reference type!
编译器抱怨,因为您的方法对T
没有约束,这意味着您可以接受不符合T
规范的Table<T>
。
因此,您的方法需要至少与它接受的内容一样严格。试试这个:
private static Dictionary<string, string> GetProperties<T>(Table<T> table) where T : class
答案 1 :(得分:22)
只需将约束where T : class
添加到方法声明中即可。
这是必需的,因为Table<TEntity>
具有where TEntity : class
约束。否则,可以使用struct type参数调用泛型方法,这需要CLR使用该结构类型参数实例化Table<TEntity>
,这将违反Table<TEntity>
上的约束。
答案 2 :(得分:0)
public class TEntityRepository<TEntity> : EFRepository<TEntity> , ITEntityRepository<TEntity>
where TEntity : class, new()
{
}