Исключение дженериков в методах расширенияC#

Место общения программистов C#
Ответить
Anonymous
 Исключение дженериков в методах расширения

Сообщение Anonymous »

Ниже приведена начальная структура кода

Код: Выделить всё

public abstract class ChildBase;
public class Parent1Child : ChildBase;
public class Parent2Child : ChildBase;

public class ParentBase
where T1 : ChildBase
{
public List Children = new List();
}

public class Parent1 : ParentBase
;
Я хотел бы создать метод расширения для EntityTypeBuilder ef core, чтобы я мог расширить сущность общим способом
Ниже приведены попытки:

Код: Выделить всё

public static class ParentExtensions
{
public static void Test1(this ParentBase parent)
where T : ChildBase
{
var children = parent.Children;
}
}

public static class EfExtensions
{
public static void Test2(this EntityTypeBuilder builder)
where TEntity : ParentBase
{
builder.HasMany(x => x.Children).WithOne();
}

public static void Test3(this EntityTypeBuilder builder)
where TEntity : ParentBase
where TChild : ChildBase
{
builder.HasMany(x => x.Children).WithOne();
}
}
для сценария, когда я хочу вызвать метод расширения непосредственно для объекта - дженерики подразумеваются (опускаются), и компилятор не жалуется:

Код: Выделить всё

var parent = new Parent1();
parent.Test1(); // works
но когда я пытаюсь вызвать метод расширения в сборщике, компилятор начинает жаловаться, если я явно не предоставлю универсальные типы!

Код: Выделить всё

EntityTypeBuilder
 builder;
builder.Test2(); // wrong
builder.Test3(); // wrong
builder.Test3(); // works!
Почему необходимо явно указывать общий тип при вызове метода расширения компоновщика? Я думаю, что передача типа дочернего класса является избыточной и поэтому ее следует опустить. Есть ли способ это исправить?


Подробнее здесь: https://stackoverflow.com/questions/786 ... on-methods
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»