В различных таблицах базы данных у меня есть и свойство и столбец значений. Я использую Linq для SQL для доступа к базе данных.
Я пишу метод, который возвращает словарь, содержащий свойства/значения, полученные от данной таблицы базы данных:
private static Dictionary GetProperties(Table table)
{
Dictionary properties = new Dictionary();
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
'
Я попытался искать это сообщение об ошибке без удачи.
Ища StackOverflow, этот вопрос кажется подобным, хотя относительно списка параметров: Универсальный Список
Чтение Руководства по программированию C# на MSDN: http://msdn.microsoft.com/en-us/library/twcad0zb (По сравнению с 80) .aspx я вижу их примеры вся передача параметры ссылкой. Однако я не вижу, как передать ссылкой в моем особом случае, так как универсальный тип только для определения универсального типа Таблицы.
Любые указатели очень ценились бы.
PS: Appologies, если это занимает время, чтобы я принял ответ как эта функция, в настоящее время не доступен (я являюсь слепым и использую программу для чтения с экрана).
Это происходит из-за того, как объявлено Table
:
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
.
Таким образом, ваш метод должен быть по крайней мере таким же строгим в отношении того, что он принимает. Попробуйте вместо этого:
private static Dictionary<string, string> GetProperties<T>(Table<T> table) where T : class
Просто добавьте ограничение где T : class
к объявлению метода.
Это необходимо, так как Table
имеет где TEntity : class
ограничение. В противном случае Ваш общий метод может быть вызван с параметром типа структуры, что потребует от CLR инстанцирования Table
с этим параметром типа структуры, что нарушит ограничение на Table
.