C#:如何在尝试从另一个程序集中使用设置变量之前确保它存在?

Posted

技术标签:

【中文标题】C#:如何在尝试从另一个程序集中使用设置变量之前确保它存在?【英文标题】:C#: How to make sure a settings variable exists before attempting to use it from another assembly? 【发布时间】:2011-06-06 13:49:27 【问题描述】:

我有以下几点:

using CommonSettings = MyProject.Commons.Settings;

public class Foo

    public static void DoSomething(string str)
    
        //How do I make sure that the setting exists first?
        object setting = CommonSettings.Default[str];

        DoSomethingElse(setting);
    

【问题讨论】:

msdn.microsoft.com/en-us/library/… 【参考方案1】:

根据CommomSettings.Default 是什么类型,简单的空检查应该没问题:

if(setting != null)
    DoSomethingElse(setting);

如果您想在尝试检索设置之前进行检查,您需要发布 CommonSettings.Default 的类型。它看起来像一个字典,所以你可以逃脱:

if(CommonSettings.Default.ContainsKey(str))

    DoSomethingElse(CommonSettings.Default[str]);

【讨论】:

我认为他更多的是询问如何确保设置存在,而不仅仅是检查它是否存在。 @Uwe - 你可能是对的。我无法从 OP 问题的措辞中看出。我也为那个案例添加了一些东西。 然而,它是一个 Settings.settings 文件被构造...我不认为它是一个字典类型,因为CommonSettings.Default.ContainsKey(...) 不在智能感知中。 这不适用于 Properties.Settings.Default。 @Salle55 提供了一个很好的解决方案,可以与下面的 Properties.Settings.Default 一起使用。 对我来说:CommonSettings.Default.Context.ContainsKey(str)(VS 2019,.NET4.5)【参考方案2】:

您可以执行以下操作:

public static void DoSomething(string str)

    object setting = null;

    Try
    
        setting = CommonSettings.Default[str];
    
    catch(Exception ex)
    
        Console.out.write(ex.Message);
    

    if(setting != null)
    
        DoSomethingElse(setting);
    

这将确保设置存在 - 您可以更进一步并尝试捕获确切的异常 - 例如 catch(IndexOutOfBoundsException ex)

【讨论】:

刚刚看到你的更新贾斯汀 - 你的解决方案看起来更干净:)【参考方案3】:

这就是你的处理方式:

if(CommonSettings.Default.Properties[str] != null)

    //Hooray, we found it!

else

    //This is a 'no go'

【讨论】:

即使您之前没有设置过,这个条件也会成立。我想 OP 想知道这个设置以前设置过。【参考方案4】:
try

    var x = Settings.Default[bonusMalusTypeKey]);

catch (SettingsPropertyNotFoundException ex)

    // Ignore this exception (return default value that was set)

【讨论】:

一些描述会很有用!【参考方案5】:

如果您使用的是SettingsPropertyCollection,您必须循环并检查您自己似乎存在哪些设置,因为它没有任何 Contains 方法。

private bool DoesSettingExist(string settingName)

   return Properties.Settings.Default.Properties.Cast<SettingsProperty>().Any(prop => prop.Name == settingName);

【讨论】:

谢谢 salle55。做得好。对于没有使用 System.Configuration 的用户,请添加前缀 System.Configuration。到 SettingsProperty>

以上是关于C#:如何在尝试从另一个程序集中使用设置变量之前确保它存在?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 c# 应用程序中正确保护 api 凭据

从另一个脚本C#访问变量[重复]

如何从另一个 WinForm 中通过 C# WinForm 查看

如何从另一个函数中获取变量

如何在 maven pom.xml 中正确定义插件版本?

如何使用linq c#优化嵌套循环并从另一个列表中过滤