我正在努力让这个工作: http://drwpf.com/blog/2009/03/17/tips-and-tricks-making-value-converters-more-accessible-in-markup/
我从我们有基类的注释中获取代码,然后从中派生出来。但是,当我这样做时,我会收到错误:
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()
这似乎解决了它,但后来我无法从这个类派生
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种类型 参数C:\ SVN \ IDATT \ Code \ IDATT.Dispatch \ ValueConverters.cs 29 44 IDATT.Dispatch
另外,有人可以解释“T:class,new”的意思吗?我刚刚开始理解泛型,但不确定这个特定的语法是做什么的。
答案 0 :(得分:3)
您理解,您正在为他的文章中描述的WPF博士的技术实施建议的通用扩展。该扩展是由AlanO在文章的评论中提供的。因为AlanO试图将代码直接粘贴到注释中,所以大于和小于字符都被“吃掉”,使得代码不可编译。
例如,评论者将此代码粘贴到评论中:
public abstract class ConverterMarkupExtension<T>: MarkupExtension, IValueConverter
这就是通过评论过滤器的原因:
public abstract class ConverterMarkupExtension: MarkupExtension, IValueConverter
因此,您必须修复损坏的代码才能使其再次运行。如果您对仿制药不满意,那么修理的内容可能不会立即显而易见!
我猜测接下来要修理的是:
public class BytesToKBValueConverter : ConverterMarkupExtension
应该是:
public class BytesToKBValueConverter : ConverterMarkupExtension<BytesToKBValueConverter>
如果这是你第一次接触仿制药,那么这种风格就是不同寻常的一面!
效果是代码是值转换器和同时是标记扩展,并且标记转换器只返回自身的另一个实例(这是一个值转换器)。然而,这 是原始文章的精神,但我的观点是,WPF博士的原始非泛型方法非常棘手,没有引入泛型,只是让代码更难以阅读而不会真正节省太多样板。这取决于您哪种方法更能满足您的需求。
答案 1 :(得分:1)
Where T : class, new()
说类型T应该是引用类型,它应该有一个公共无参数ctor。
public class BytesToKBValueConverter : ConverterMarkupExtension
请提供ConverterMarkeupExtension&lt; T> T型那里。