Как бы мне написать метод расширения для System.Data.Linq.Таблица ?

#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