gpt4 book ai didi

.net - 与 ConfigurationProperty 属性一起使用时,属性类型的隐式约定是什么?

转载 作者:行者123 更新时间:2023-12-01 01:30:36 25 4
gpt4 key购买 nike

例如,我想序列化和反序列化 System.Version对象作为我的应用程序自定义配置部分的一部分。我正在尝试使用以下属性声明来做到这一点:

public class ConfigElement : ConfigurationElement
{
[ConfigurationProperty("ver", IsRequired = false, DefaultValue = "1.2.4.8")]
public Version Ver
{
get { return (Version)this["ver"]; }
set { this["ver"] = value; }
}
}

不幸的是,尝试序列化或使用此属性(有或没有 DefaultValue )会产生以下异常消息。

System.Configuration.ConfigurationErrorsException:属性“ver”的值无法转换为字符串。错误是:无法找到支持转换为/从类型为“Version”的属性“ver”的字符串的转换器。
System.Version.ToString()将对象写入众所周知的字符串格式,该格式可由 System.Version.ctor(string) 使用,因此对于这种类型存在“转换器”似乎是可行的。相比之下, System.TimeSpan type 具有类似的方法和功能( Parse 代替 .ctor(string) )并且该类型与配置系统配合良好(必须已经存在转换器)。

我怎么知道一个类型是否有合适的转换器?这种类型必须满足什么契约(隐式或其他)?

最佳答案

要使 ConfigurationProperty 起作用,所使用的类型必须与 TypeConverter 相关联。比知道如何从字符串转换。 ConfigurationProperty 确实有一个 Converter属性,但遗憾的是,它是只读的。而且,这真的很不幸,Version 也没有声明隐式 TypeConverter。

但是你可以做的是添加一个 TypeConverterAttribute以编程方式添加到 Version 类,它将解决所有这些问题。因此,在访问配置之前,您基本上需要在程序中调用此行一次:

TypeDescriptor.AddAttributes(typeof(Version), new TypeConverterAttribute(typeof(VersionTypeConverter)));
// ... you can call configuration code now...

使用以下定制的 VersionTypeConverter:
public class VersionTypeConverter : TypeConverter
{
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
return new Version((string)value);
}

public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
if (sourceType == typeof(string))
return true;

return base.CanConvertFrom(context, sourceType);
}
}

关于.net - 与 ConfigurationProperty 属性一起使用时,属性类型的隐式约定是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5047921/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com