我已经研究过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。
我的问题:
目前,我有许多自定义TypeConverter类(没有使用泛型),其中唯一不同的代码行是调用ConvertFromString。在每个自定义TypeConverter中,ConvertFromString使用它转换的相应类名显式硬编码。如果我可以用一个通用转换器类替换所有这些自定义转换器类,那多么可爱。
(解决方案必须向后兼容.NET 3.5。)
答案 0 :(得分:0)
谢谢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类;这款新型通用转换器足以满足我的需求。甜!