Элегантный вызов статического конструктора листа из базового абстрактного класса в C#.C#

Место общения программистов C#
Ответить
Anonymous
 Элегантный вызов статического конструктора листа из базового абстрактного класса в C#.

Сообщение Anonymous »

Я пишу библиотеку генератора POCO, используя EF Core 3 для .NET Standard 2.0. Эта библиотека будет использоваться для создания файлов .cs с помощью шаблонов T4 в проектах .NET Framework и .NET Core.
Я создал класс-оболочку, в которой хранятся статические функции. для всех типичных запросов LINQ, таких как .Where, .FirstOrDefault и т. д.
Вот пример:

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

public abstract class QueryableTable where T : QueryableTable, new()
{
public static Func QueryInitializer;

public static List Where(Expression predicate, bool eagerLoad = false)
{
using (var context = new DatabaseContext())
{
return QueryInitializer(context, eagerLoad).Where(predicate).ToList();
}
}
}
Теперь в моей модели я использую статический конструктор для инициализации QueryInitializer внутри QueryableTable, как показано здесь:

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

[Table("comment")]
public class Comment : QueryableTable
{
[Key]
public int Id { get; set; }

public int PersonId { get; set; }

// Navigation property
public Person Person { get; set; }

static Comment()
{
QueryableTable.QueryInitializer = (context, eagerLoad) =>
{
return eagerLoad ?
context.Set().Include(t => t.Person) as IQueryable :
context.Set();
};
}
}
Это работает, если я вызываю статический конструктор Comment перед доступом к абстрактному классу через Comment.Where(t => t.Id == 1).
Однако, если я сразу вызову его, не вызывая сначала статический конструктор Comment, я получу исключение нулевой ссылки в QueryInitializer, как и ожидалось.
Все это имеет смысл, но сначала я пытаюсь найти элегантный способ вызова статического конструктора перед статическим методом, а во-вторых, я пытаюсь убедить себя, что хотя этот дизайн будет полезно на практике из-за простоты запросов с помощью статических методов Class.Where(), делать эти методы статическими нецелесообразно.

Подробнее здесь: https://stackoverflow.com/questions/790 ... in-c-sharp
Ответить

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

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

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

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

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