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

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

Сообщение Anonymous »

Я пишу библиотеку генератора POCO, используя EF Core 3 в netstandard 2.0. Эта библиотека будет использоваться для создания файлов .cs с помощью шаблонов T4 в проектах .NET Framework и .NET Core.
Я создал класс-оболочку, в которой хранятся статические функции для всех ваших типичных Запросы LINQ, например, где, 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#»