c# 3.0 -如何实现通用的c# TypeConverter

本文关键字:TypeConverter 实现 何实现 | 更新日期: 2023-09-27 18:01:42

我研究了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. 是否有一种方法来调用静态方法ConvertFromString只使用T?
  2. 可以#1利用ConvertFromString是静态的?
  3. 在不事先创建T类型对象的情况下可以完成#2吗?

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

  • 这可能吗?
  • 我错过了什么知识?

(解决方案必须向后兼容。net 3.5)

c# 3.0 -如何实现通用的c# TypeConverter

谢谢Alex!

是的,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类;这个新的通用转换器足以满足我的需要。甜蜜的!