You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:41:21