gpt4 book ai didi

c# - 如何实际使用 TypeConverter 以及它与 System.Convert.ToXXX() 有何不同

转载 作者:行者123 更新时间:2023-11-30 14:46:21 27 4
gpt4 key购买 nike

我一直在寻找一种更直观的方式来在 C# 中的数据类型之间进行转换(例如从枚举到字符串),所以我偶然发现了 TypeConverter 类。我已经阅读了有关如何创建一个的文档,它看起来相当简单,只需使用一些自定义转换逻辑覆盖 TypeConverter 中的一些方法即可完成。

但是,既然我已经创建了这个转换器,我就无法弄清楚如何实际使用它。我找到的每一个资源都简单地解释了如何创建一个,而我看到的唯一实际使用它的引用是用 [TypeConverter(typeof(MyConverter))] 装饰我的类型类。问题是我实际上没有类型类,我的类型是一个枚举和字符串,所以我不知道我应该把 TypeConverter 放在哪里。

假设如果我的类型是一个自定义类,我将装饰放在它定义的类上,那么我将如何转换类型?我是否只是在任何我想要的地方使用该类型作为字符串,转换器将神奇地完成它的工作而不被询问,或者我是否需要以某种方式提示它。是否有我可以使用类型转换器的范围,或者它是否可以在类型所在的任何地方访问?

我有点期待它像 System.Convert 一样工作,但事实似乎并非如此。

最佳答案

枚举仍然是自定义类型,仍然可以具有 [TypeConverter] 等属性。

只有少数API使用了TypeConverter;特别是,这意味着 System.ComponentModel,它驱动诸如 PropertyGrid 之类的东西,因此:您不会在所有地方自动获得它,但它在某些情况下仍然有用个案。获取转换器的主要方式是:

var conv = TypeDescriptor.GetConverter(obj);

它允许它使用属性(你已经找到),还有 ICustomTypeDescriptorTypeDescriptor,通过 TypeDescriptor.GetProvider/TypeDescriptor.AddProvider。这是一个非常困惑但灵活的动态描述数据模型。

然而,在大多数情况下,TypeConverter 通常不是实现事物的方式。作为一个勉强工作的例子:

using System;
using System.ComponentModel;
using System.Globalization;

static class P
{
static void Main()
{
var foo = Foo.Gamma;
var converter = TypeDescriptor.GetConverter(typeof(Foo));
string s = converter.ConvertToString(foo);
Console.WriteLine(s);
}
}

[TypeConverter(typeof(FooConverter))]
public enum Foo
{
Alpha, Beta, Gamma
}
class FooConverter : TypeConverter
{
public override object ConvertTo(ITypeDescriptorContext context,
CultureInfo culture, object value, Type destinationType)
{
// write it backwards, because: reasons
if (destinationType == typeof(string)) {
var s = value.ToString();
char[] c = s.ToCharArray();
Array.Reverse(c);
return new string(c);
}
return base.ConvertTo(context, culture, value, destinationType);
}
}

但是,如前所述,当与 PropertyGrid 或其他 UI 元素混合使用时,它可能更有意义。

它与 Convert.* 上的方法非常不同,因为那不是一个可扩展的模型。 System.ComponentModel 可以在运行时进行调整,并与在对象级别(而非类型级别)描述自身的对象一起使用。它的主要用途是像 DataTable 这样的东西,这样一行就可以像它具有为每一列命名的属性一样 - 通过 PropertyDescriptor 而不是 PropertyInfo(反射)。

关于c# - 如何实际使用 TypeConverter 以及它与 System.Convert.ToXXX() 有何不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49487203/

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