【问题标题】:custom types in settings设置中的自定义类型
【发布时间】:2011-06-24 14:46:43
【问题描述】:

如何在“设置”中拥有自己的类型。

我成功地将它们放在设置表中,但问题是我无法设置默认值。 问题是我在 app.config 中看不到设置。

【问题讨论】:

  • 你能解释一下你的问题吗,多一点。
  • 您遇到的错误是什么? “'Value' 无法转换为 'YourSettingsType' 类型的实例”?
  • 您是否尝试在 app.config 文件中使用自定义配置设置,或者您究竟想要实现什么?
  • 没有确切的错误,当我尝试在 Settings.setting 设计器视图中设置 vakue 时,它​​只是不允许设置任何值。

标签: c# .net


【解决方案1】:

如果我对您的问题的解释正确,那么您有一个自定义类型,我们称之为CustomSetting,您可以在您的Settings.settings 文件中设置该类型的设置,并使用@ 指定该设置的默认值987654324@ 或 Visual Studio 的设置 UI。

如果这是您想要做的,您需要为您的类型提供一个TypeConverter,它可以从字符串转换,如下所示:

[TypeConverter(typeof(CustomSettingConverter))]
public class CustomSetting
{
    public string Foo { get; set; }
    public string Bar { get; set; }

    public override string ToString()
    {
        return string.Format("{0};{1}", Foo, Bar);
    }
}

public class CustomSettingConverter : TypeConverter
{
    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
    {
        if( sourceType == typeof(string) )
            return true;
        else
            return base.CanConvertFrom(context, sourceType);
    }

    public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
    {
        string stringValue = value as string;
        if( stringValue != null )
        {
            // Obviously, using more robust parsing in production code is recommended.
            string[] parts = stringValue.Split(';');
            if( parts.Length == 2 )
                return new CustomSetting() { Foo = parts[0], Bar = parts[1] };
            else
                throw new FormatException("Invalid format");
        }
        else
            return base.ConvertFrom(context, culture, value);
    }
}

一些背景资料

TypeConverter 支持 .Net 框架中的许多字符串转换魔法。它不仅对设置有用,而且还用于 Windows 窗体和组件设计人员如何将属性网格中的值转换为其目标类型,以及 XAML 如何转换属性值。该框架的许多类型都有自定义的 TypeConverter 类,包括所有基本类型,但也包括 System.Drawing.SizeSystem.Windows.Thickness 等类型。

在您自己的代码中使用 TypeConverter 非常简单,您只需这样做:

TypeConverter converter = TypeDescriptor.GetConverter(typeof(TargetType));
if( converter != null && converter.CanConvertFrom(typeof(SourceType)) )
    targetValue = (TargetType)converter.ConvertFrom(sourceValue);

支持的源类型各不相同,但string 是最常见的一种。与普遍存在但不太灵活的 Convert 类(仅支持原始类型)相比,它是一种更强大(不幸的是鲜为人知)从字符串转换值的方法。

【讨论】:

  • 请注意,如果还提供ConvertTo()/CanConvertTo() 方法,则可以使用此技术将运行时值保存到当前用户设置。需要注意的是,您将无法使用 Designer 来配置该设置的默认设置,并且您必须手动编辑 Settings.Designer.cs 文件以将您自己的类型用于 Settings 对象属性类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-13
  • 2017-04-10
  • 2020-04-17
  • 2011-09-11
  • 2020-01-06
  • 1970-01-01
相关资源
最近更新 更多