通过反射调用时的过时("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 包含过时的方法,它也可以正常工作。
我想将空构造函数标记为 [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 包含过时的方法,它也可以正常工作。