通过反射调用时的过时("somestring",真)属性

Obsolete("somestring", true) attribute when called via reflection

我想将空构造函数标记为 [Obsolete("...", true)] 因为它仅适用于 EF Core,我不想调用它。问题是,我不知道这是否会导致 EF Core 出现问题(这不会是编译器错误,因为它是通过反射调用的,但反射会使用此属性吗?)

当你在任何方法或属性上应用ObsoleteAttribute时,你需要传递消息和isError。如果 IsError 为真,这将产生编译时错误,否则将产生警告。

[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 包含过时的方法,它也可以正常工作。