[英]Generic type converter - issues with generics
我试图让这个工作: http://drwpf.com/blog/2009/03/17/tips-and-tricks-making-value-converters-more-accessible-in-markup/
我从我们有基础 class 的注释中获取代码,然后从中派生。 但是,当我这样处理时出现错误:
public abstract class ConverterMarkupExtension: MarkupExtension, IValueConverter where T: class, new()
{
private static T m_converter = null;
public override object ProvideValue(IServiceProvider serviceProvider)
{
return m_converter ?? (m_converter = new T());
}
#region IValueConverter Members
public abstract object Convert(object value, Type targetType, object parameter, CultureInfo culture);
public abstract object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture);
#endregion
}
它说“非泛型声明不允许约束。我将其更改为:
public abstract class ConverterMarkupExtension<T>: MarkupExtension, IValueConverter where T: class, new()
这似乎解决了它,但我不能从这个 class 派生
public class BytesToKBValueConverter : ConverterMarkupExtension
{
public override object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value != null && value is double)
{
double bytes = System.Convert.ToDouble(value);
return bytes / 1024.0d;
}
else
return value;
}
public override object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotSupportedException();
}
}
在这里我得到错误:
错误 1 使用通用类型 'IDATT.Dispatch.ConverterMarkupExtension' 需要 1 种类型 arguments C:\SVN\IDATT\Code\IDATT.Dispatch\ValueConverters.cs 29 44 IDATT.Dispatch
另外,有人能解释一下“where T: class, new”是什么意思吗? 我刚刚开始了解 generics 但不确定这种特殊语法的作用。
正如您所理解的,您正在对他的文章中描述的 WPF 博士的技术实施建议的通用扩展。 该扩展是在 AlanO 对文章的评论中提供的。 因为 AlanO 试图将代码直接粘贴到注释中,所以所有大于和小于字符都被“吃掉”,导致他的代码无法编译。
例如,评论者将此代码粘贴到评论中:
public abstract class ConverterMarkupExtension<T>: MarkupExtension, IValueConverter
这就是通过评论过滤器的原因:
public abstract class ConverterMarkupExtension: MarkupExtension, IValueConverter
因此,您必须修复损坏的代码才能使其再次工作。 如果您对 generics 不满意,修复的内容可能不会立即显现!
我猜接下来要修复的是:
public class BytesToKBValueConverter : ConverterMarkupExtension
应该是:
public class BytesToKBValueConverter : ConverterMarkupExtension<BytesToKBValueConverter>
如果这是您第一次接触 generics,那么这种风格是与众不同的!
效果是代码同时是一个值转换器和一个标记扩展,而标记转换器只是返回它自己的另一个实例(它是一个值转换器)。 然而,这是原始文章的精神,但我认为 WPF 博士的原始非泛型方法足够棘手,没有引入 generics 只会使代码更难阅读,而不会真正节省大量样板。 哪种方法更能满足您的需求取决于您。
Where T : class, new()
说类型 T 应该是一个引用类型并且它应该有一个公共的无参数 ctor。
public class BytesToKBValueConverter : ConverterMarkupExtension
请在此处提供 ConverterMarkeupExtension< T > T 类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.