#c# #reflection #entity-framework-core #attributes
Вопрос:
Я хочу пометить пустой конструктор как [Устаревший(«…», true)], потому что он предназначен только для ядра EF, и я не хочу, чтобы он вызывался. Дело в том, что я не знаю, создаст ли это проблемы с ядром EF или нет (это не будет ошибкой компилятора, потому что оно вызывается через отражение, но будет ли отражение работать с этим атрибутом?)
Комментарии:
1. Это интересный вопрос. Вы уже пробовали это сделать?
Ответ №1:
когда вы применяете ObsoleteAttribute
какой-либо метод или свойство, вам необходимо передать сообщение и isError. Это приведет к ошибке во время компиляции, если значение IsError равно true, иначе будет выдано предупреждение.
[ObsoleteAttribute(message, isError)]
Когда вы вызываете этот метод с помощью отражения, он не выдает ошибку и успешно выполняется. пожалуйста, обратитесь к приведенному ниже примеру :
[ObsoleteAttribute("This method is obsolete. Call NewMethod instead.", true)]
public string OldMethod()
{
return "You have called OldMethod.";
}
Вызовите этот метод с помощью отражения
MethodInfo method = typeof(Example).GetMethod("OldMethod");
var result = method.Invoke(this, null);
Он успешно выполняется.
Поскольку вы знаете значение IsError, вы можете поиграть с ним, если захотите ввести ограничения. Отражение
MemberInfo[] members = typeof(Class).GetMembers();
foreach (var member in members)
{
ObsoleteAttribute[] attribs = (ObsoleteAttribute[])member.GetCustomAttributes(typeof(ObsoleteAttribute), false);
if (attribs.Length > 0)
{
ObsoleteAttribute attrib = attribs[0];
var isErrorValue = attrib.IsError // you can use this.
}
}
Использование EFCore
public async Task<ActionResult<IEnumerable<TodoItem>>> GetTodoItems()
{
MethodInfo method = typeof(TodoContext).GetMethod("OldMethod");
if (method != null)
{
var result = method.Invoke(null, null);
}
return await _context.TodoItems.ToListAsync();
}
Здесь DbContext содержит устаревший метод, и он также работает нормально.
Комментарии:
1. Но я задал этот вопрос в более широком контексте. выполняет ли EF Core
attrib.IsError
проверку и не работает, если установлено значение true?2. Он также отлично работает без ошибок. В EFCore нет проверки устаревших методов. (см. Пример кода выше).