C#中如何实现API方法对VisibleToA或VisibleToB的可见性?
解决自定义可见性特性的OR逻辑需求
要实现满足VisibleToA或VisibleToB任一即可访问的逻辑,有几种灵活的方案,你可以根据自己的代码架构选择:
方案1:创建复合"或逻辑"特性
这种方式最直观,直接定义一个专门用于表示"任一满足即可"的特性,让代码可读性更强:
首先定义复合特性:
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] public class VisibleToEitherAttribute : Attribute { // 接受需要检查的可见性特性类型 public Type[] TargetVisibilityAttributes { get; } public VisibleToEitherAttribute(params Type[] visibilityAttrTypes) { TargetVisibilityAttributes = visibilityAttrTypes; } }
保持你原来的单个可见性特性不变:
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] public class VisibleToAAttribute : Attribute { } [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] public class VisibleToBAttribute : Attribute { }
然后修改你的权限检查逻辑:
public bool IsMethodAccessible(MethodInfo method) { // 优先检查是否使用了"或逻辑"复合特性 var eitherAttr = method.GetCustomAttribute<VisibleToEitherAttribute>(); if (eitherAttr != null) { // 只要有一个目标特性存在,就返回可访问 foreach (var attrType in eitherAttr.TargetVisibilityAttributes) { if (method.GetCustomAttribute(attrType) != null) { return true; } } return false; } // 没有复合特性时,保持默认的AND逻辑 var hasA = method.GetCustomAttribute<VisibleToAAttribute>() != null; var hasB = method.GetCustomAttribute<VisibleToBAttribute>() != null; return hasA && hasB; }
使用时,直接标记复合特性即可:
[VisibleToEither(typeof(VisibleToAAttribute), typeof(VisibleToBAttribute))] public void ConditionallyVisibleMethod() {}
方案2:添加逻辑控制特性切换AND/OR
如果需要在同一个方法上灵活切换逻辑(有时候AND,有时候OR),可以加一个控制逻辑的特性:
首先定义逻辑枚举和控制特性:
public enum VisibilityCombineLogic { And, Or } [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] public class VisibilityLogicAttribute : Attribute { public VisibilityCombineLogic Logic { get; } public VisibilityLogicAttribute(VisibilityCombineLogic logic) { Logic = logic; } }
然后修改检查逻辑:
public bool IsMethodAccessible(MethodInfo method) { var hasA = method.GetCustomAttribute<VisibleToAAttribute>() != null; var hasB = method.GetCustomAttribute<VisibleToBAttribute>() != null; // 检查是否有逻辑控制特性 var logicAttr = method.GetCustomAttribute<VisibilityLogicAttribute>(); if (logicAttr != null && logicAttr.Logic == VisibilityCombineLogic.Or) { return hasA || hasB; } // 默认使用AND逻辑 return hasA && hasB; }
使用时,只要在原有特性基础上加上逻辑控制即可:
[VisibleToA] [VisibleToB] [VisibilityLogic(VisibilityCombineLogic.Or)] public void ConditionallyVisibleMethod() {}
方案3:直接修改默认检查逻辑(不推荐)
如果你确定所有多特性标记都需要OR逻辑,也可以直接修改检查逻辑,把原来的&&改成||:
public bool IsMethodAccessible(MethodInfo method) { var hasA = method.GetCustomAttribute<VisibleToAAttribute>() != null; var hasB = method.GetCustomAttribute<VisibleToBAttribute>() != null; // 直接返回OR结果 return hasA || hasB; }
但这种方式不够灵活,会丢失原来的AND逻辑能力,除非你确定不需要再支持AND场景。
内容的提问来源于stack exchange,提问作者anon
相关产品推荐
相关产品推荐

