泛型类型转换器-泛型问题

本文关键字:问题 泛型 转换器 泛型类型 | 更新日期: 2023-09-27 17:58:36

我正在努力让它发挥作用: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.ConverMarkupExtension'需要1种类型参数C:''SVN''IDATT''Code''IATT.Dispatch''ValueConverters.cs 29 44 IDATT.Dispatch

另外,有人能解释一下"哪里是T类,新的"是什么意思吗?我刚开始理解泛型,但不确定这种特殊语法的作用。

泛型类型转换器-泛型问题

为了便于理解,您正在实现建议的对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博士的原始非泛型方法足够棘手,没有引入泛型,只会使代码更难阅读,而不会真正节省太多样板。哪种方法能更好地满足您的需求取决于您。

Where T : class, new()

表示类型T应该是一个引用类型,并且应该有一个公共的无参数ctor。

public class BytesToKBValueConverter : ConverterMarkupExtension

请提供转换器标记扩展<T>T型。