【问题标题】:Generic type converter - issues with generics泛型类型转换器 - 泛型问题
【发布时间】:2011-06-07 04:03:01
【问题描述】:

我正在尝试让这个工作: http://drwpf.com/blog/2009/03/17/tips-and-tricks-making-value-converters-more-accessible-in-markup/

我从我们有基类的 cmets 获取代码,然后从它派生。但是,当我这样处理时出现错误:

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

另外,有人能解释一下“where T: class, new”是什么意思吗?我刚刚开始了解泛型,但不确定这种特定语法的作用。

【问题讨论】:

    标签: c# wpf generics ivalueconverter


    【解决方案1】:

    只是为了让您理解,您正在对 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 博士最初的非泛型方法足够棘手,没有引入泛型,只会使代码更难阅读而没有真正节省大量样板。哪种方法更能满足您的需求取决于您。

    【讨论】:

    • 谢谢,我没有意识到 cmets 引擎将其剥离 :) 但现在它是有道理的。我让它完全按照您在发布之前所说的那样工作,但我对派生类声明的外观(冗余)并不满意,而且我还收到了 reSharper 警告关于泛型类中的静态变量。真的会痛吗?
    【解决方案2】:
    Where T : class, new()
    

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

    public class BytesToKBValueConverter : ConverterMarkupExtension
    

    请在此处提供 ConverterMarkeupExtension T 类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多