Устаревший(«somestring», true) атрибут при вызове через отражение

#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 нет проверки устаревших методов. (см. Пример кода выше).