#c# #linq-to-sql #extension-methods
#c# #linq-to-sql #методы расширения
Вопрос:
Я хотел написать этот небольшой, тривиальный метод расширения для какого-нибудь одноразового тестового / консольного приложения, и я не смог понять, как правильно получить сигнатуру метода. Я хочу добавить это к каждому System.Data.Linq.Таблица, которая у меня есть, и я хочу, чтобы она принимала экземпляр типа T в качестве параметра.
Вот что у меня есть до сих пор, что не компилируется
public static void InsertAndSubmit<T>(this System.Data.Linq.Table<T> tbl, T element)
{
tbl.InsertOnSubmit(element);
tbl.Context.SubmitChanges();
}
Тип ‘T’ должен быть ссылочным типом, чтобы использовать его в качестве параметра
‘TEntity’ в общем типе или методе
‘System.Data.Linq.Таблица ‘
Ответ №1:
Попробуйте это:
public static void InsertAndSubmit<T>(this System.Data.Linq.Table<T> tbl, T element)
where T : class
{
tbl.InsertOnSubmit(element);
tbl.Context.SubmitChanges();
}
Вам нужно ограничить тип T
ссылочного типа ( class
), чтобы это работало.
Если вы посмотрите на Table<TEntity>
документацию, вы заметите это же ограничение типа для TEntity
of class
. Поэтому T
, чтобы быть совместимым с TEntity
ним, он должен соответствовать тем же ограничениям.
Комментарии:
1. Итак, единственная причина, по которой я должен указать это в своем методе расширения, заключается в том, что они указывают это в своем определении? Спасибо!
2. Да. Компилятор видит, что ваш
T
не ограничен и, следовательно, несовместим с ограничениями, указанными наTEntity
. Итак, вы должны ограничить свой тип, чтобы компилятор был доволен тем, что ваш тип действительно совместимTEntity
.3. Блестяще, это имеет смысл. Я никогда не думал заглядывать в определение
Linq.Table
, и я сходил с ума. Я никогда не понимал, что ограничения переносятся на методы расширения. Большое спасибо! Я соглашусь, когда это позволит мне
Ответ №2:
Вам нужно указать, что вы будете использовать только типы ссылок в вашем T
. Попробуйте:
public static void InsertAndSubmit<T>(this System.Data.Linq.Table<T> tbl, T element)
where T : class
{
tbl.InsertOnSubmit(element);
tbl.Context.SubmitChanges();
}
Комментарии:
1. Ага, спасибо, я был совершенно уверен, что моя подпись метода верна. Я не думал, что нужно указывать тип T