【问题标题】:How to implement a general purpose C# TypeConverter? [duplicate]如何实现通用 C# TypeConverter? [复制]
【发布时间】:2016-08-10 18:43:26
【问题描述】:

我研究了 C# 编译器错误 CS1061,但我不确定如何解决此代码生成的错误。我正在尝试设计一个使用泛型类型的通用 TypeConverter 类。

首先,我定义了一个用作可扩展属性的类。它有一个静态方法“ConvertFromString”,TypeConverter 会调用它。

[TypeConverter(typeof(MyClassConverter))]
public class MyClass
{
  ...
  public static MyClass ConvertFromString(string s, MyClass OldValue)
  {
  ...
  }
}

我想像这样定义一个 TypeConverter,

public class MyClassConverter<T> : ExpandableObjectConverter
{
  ...
  public override object ConvertFrom(ITypeDescriptorContext context,
                                     CultureInfo culture, object value)
  {
  GridItem gridItem = context as GridItem;
  object itemValue = gridItem == null ? null : gridItem.Value;

  if (value is string)
      return typeof(T).ConvertFromString((string)value, (T)itemValue);

  return base.ConvertFrom(context, culture, value);
  }
}

这样这个通用的 MyClassConverter 就可以被其他也提供静态 ConvertFromString 方法的类使用。

我的问题(到目前为止)是这行代码,

return typeof(T).ConvertFromString((string)value, (T)itemValue);

生成编译器错误 CS1061。我很困惑如何解决它。

旁注:这个编译没有错误,

if (value is string && typeof(T) == typeof(MyClass))
    return MyClass.ConvertFromString((string)value, (MyClass)itemValue);

但是我不想指定MyClass,我只想指定T。

我的问题:

  1. 有没有办法只使用 T 调用静态方法 ConvertFromString?
  2. #1 能否利用 ConvertFromString 是静态的?
  3. #2 是否可以在不事先创建 T 类型的对象的情况下完成?

目前,我有许多自定义 TypeConverter 类(没有使用泛型),其中唯一不同的代码行是对 ConvertFromString 的调用。在每个自定义 TypeConverter 中,ConvertFromString 都使用其转换的适当类名显式硬编码。如果我可以用一个通用转换器类替换所有这些自定义转换器类,那该多好。

  • 这可能吗?
  • 我缺少什么知识?

(该解决方案必须向后兼容 .NET 3.5。)

【问题讨论】:

标签: c# c#-3.0 expandable


【解决方案1】:

谢谢亚历克斯!

是的,MethodInfo/GetMethod 是缺失的部分。

我的通用 TypeConverter 类现在看起来像这样,

public class MyClassConverter : ExpandableObjectConverter
{
    ...
    public override object ConvertFrom(ITypeDescriptorContext context,
                                       CultureInfo culture, object value)
    {
        GridItem gridItem = context as GridItem;
        object itemValue = gridItem == null ? null : gridItem.Value;

        if (value is string)
        {
            MethodInfo m = itemValue.GetType().GetMethod("ConvertFromString");
            return m.Invoke(null, new object[] { value, itemValue });
        }

        return base.ConvertFrom(context, culture, value);
    }
}

现在每个具有可扩展属性的类都可以使用一个通用的 TypeConverter 类(只要它定义了一个静态 ConvertFromString 方法)。

我刚刚删除了六个以上的自定义 TypeConverter 类;这个新的通用转换器足以满足我的需要。甜!

【讨论】:

    猜你喜欢
    • 2016-12-15
    • 2011-05-13
    • 2021-04-02
    • 2012-04-03
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 2012-06-26
    • 1970-01-01
    相关资源
    最近更新 更多