为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 if 语句中使用占位符来访问属性

如何在 if 语句中使用占位符来访问属性

C#
森林海 2023-08-20 14:25:50
我不想使用大量 if 语句来确定需要访问哪个属性,而是想知道是否可以使用占位符之类的东西。我尝试用占位符编写一些代码,这就是我遇到问题的地方。if (rootObject.permissions.{commandGroup}.{commandName}){    //do something                }这将允许访问的属性根据 commandGroup 和 commandName 中的字符串值进行更改,而无需在 JSON 扩展时使用多个 if 语句。这是 if 语句的问题://Command is an instance of CommandInfo from Discord.Netstring commandGroup = command.Module.Group;string commandName = command.Name;if (rootObject.permissions.commandGroup.commandName){    //do something}以下是 JSON 文件在类中的存储方式:    internal class RootObject    {        public Permissions permissions { get; set; }        public int points { get; set; }    }    internal class Permissions    {        public Response response { get; set; }    }    internal class Response    {        public bool ping { get; set; }        public bool helloWorld { get; set; }    }例如,如果 commandGroup 是 Response 并且 commandName 是 ping,我将如何使用 if 语句来确定值是否存储在 rootObject.permissions.response.ping 中。
查看完整描述

2 回答

?
catspeake

TA贡献1111条经验 获得超0个赞

您可以使用反射来做到这一点,如下所示:


public static class PermissionsExtensions {

    public static T CommandGroup<T>(this Permissions permissions, string commandGroup)

    {

         PropertyInfo commandGroupProperty = typeof(Permissions).GetProperty(commandGroup);

         return (T)(commandGroupProperty.GetValue( permissions));

    }

    public static bool CommandProperty<T>(this T commandGroup, string commandProperty) 

    {

        PropertyInfo commandPropertyProperty = typeof(T).GetProperty( commandProperty);

        return (bool)(commandPropertyProperty.GetValue( commandGroup));

    }

}

然后你会像这样使用它:


bool result = rootObject.permissions.CommandGroup<Response>( "response").CommandProperty( "ping");

提示:类中的属性使用大写名称,参数使用小写名称


查看完整回答
反对 回复 2023-08-20
?
弑天下

TA贡献1818条经验 获得超7个赞

看来你要访问的属性都是bool。您可以将它们全部存储在Dictionary<string, bool>:


internal class RootObject

{

    public Dictionary<string, bool> permissions { get; set; } = new Dictionary<string, bool> {

        { "response.ping", false },

        { "response.helloworld", false },

        // add more here...

    };

    public int points { get; set; }

}

现在你可以像这样访问字典:


if (rootObject.permissions[$"{commandGroup}.{commandName}"])


查看完整回答
反对 回复 2023-08-20
  • 2 回答
  • 0 关注
  • 83 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信