Универсальный конвертер типов - проблемы с универсальными - PullRequest
2 голосов
/ 07 июня 2011

Я пытаюсь заставить это работать: 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"? IЯ только начинаю понимать дженерики, но не уверен, что делает этот конкретный синтаксис.

Ответы [ 2 ]

3 голосов
/ 07 июня 2011

Как вы понимаете, вы реализуете предложенное универсальное расширение для техники доктора 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>

Если это ваше первое знакомство с дженериками, этот стиль на необычной стороне!

В результате код является преобразователем значений и одновременно расширением разметки, и преобразователь разметки просто возвращает другой экземпляр самого себя (который является преобразователем значения). Тем не менее, это является духом оригинальной статьи, но я считаю, что оригинальный неуниверсальный подход Dr. WPF достаточно сложен без введения обобщений, которые просто усложняют чтение кода без реальной экономии большого количества шаблонов. Вам решать, какой подход лучше соответствует вашим потребностям.

1 голос
/ 07 июня 2011
Where T : class, new()

Говорит, что тип T должен быть ссылочным типом и иметь открытый ctor без параметров.

public class BytesToKBValueConverter : ConverterMarkupExtension

Пожалуйста, предоставьте там ConverterMarkeupExtension T.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...