如何将存储在 web.config 中的值添加到 c# 中的 class 属性(来自 Web 配置文件而不是资源文件)

How can I add a value that is stored in web.config to a class attribute in c#(from web config file not the resource file)

public static class trial                 
{               
    public static string LUIS_MODEL_ID=ConfigurationManager.AppSettings["ID"];  
    public static string LUIS_SUBSCRIPTION_KEY =ConfigurationManager.AppSettings["KEY"];

    [LuisModel(LUIS_MODEL_ID, LUIS_SUBSCRIPTION_KEY)]  // An attribute argument must be a constant expression     
    [Serializable]            
    public class DialogLuis : LuisDialog<object>
    {                         

这是我遇到的错误:

"An attribute argument must be a constant expression"

还有其他方法可以将值从 Web.config 传递到 LuisModel 属性吗?

您可以尝试在web.config

中添加您的参数
<appSettings>
<add key="SitePath" value="http://example.com/" />

在你可以通过

获取你的参数之后
ConfigurationManager.AppSettings["SitePath"].ToString()

您可以创建一个基础 class,它将从 web.config 获取这些值并实例化 LuisDialog:

namespace ChatBot_LUIS.Dialogs
{
    [Serializable]
    public class BaseLuisDialog<T> : LuisDialog<T>
    {
        public BaseLuisDialog() : base(GetNewService())
        {

        }

        private static ILuisService[] GetNewService()
        {
            var modelId = ConfigurationManager.AppSettings.Get("LuisModelId");
            var subscriptionKey = ConfigurationManager.AppSettings.Get("LuisSubscriptionKey");
            var staging = Convert.ToBoolean(ConfigurationManager.AppSettings.Get("LuisStaging") ?? "false");
            var luisModel = new LuisModelAttribute(modelId, subscriptionKey, staging: staging);
            return new ILuisService[] { new LuisService(luisModel) };
        }
    }
}

然后在您的代码中,您应该为所有 Luis 对话框使用此基础 class 并完全删除 LuisModelAttribute。 示例:

public class RootLuisDialog : BaseLuisDialog<object>
    {
    ....
    }

您还可以继承自 LuisModelAttribute:

[Serializable]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method | AttributeTargets.Interface, AllowMultiple = true)]
public class ConfiguredLuisModelAttribute : LuisModelAttribute, ILuisModel
{
    public ConfiguredLuisModelAttribute() : base(
        GetModelId(), 
        GetSubscriptionKey(), 
        LuisApiVersion.V2,
        staging: GetStaging()) { }

    private static string GetModelId()
    {
        return ConfigurationManager.AppSettings.Get("LuisModelId");
    }

    private static string GetSubscriptionKey()
    {
        return ConfigurationManager.AppSettings.Get("LuisSubscriptionKey");
    }

    private static bool GetStaging()
    {            
        return Convert.ToBoolean(ConfigurationManager.AppSettings.Get("LuisStaging") ?? bool.FalseString);
    }