Это похоже IValueFormatter
принимает значение типа object
и возвращает значение типа string
, в то время как a ValueResolver<TSource, TDestination>
принимает значение любого типа и возвращает значение любого типа. Так, это более гибко. Существует также вопрос это с a ValueResolver
, Вы никогда не должны бросать источник к конкретному типу - Вы определяете его явно в Вашем определении класса.
Учитывая это, почему использование IValueFormatter
? Это делает что-нибудь, что не может быть, покончили ValueResolver
? Я неправильно понимаю, как это работает?
__ iter __
должен возвращать итератор, а не список.
Попробуйте это:
def __iter__(self):
return iter(self._values)
Вы также могли бы сделать:
def __iter__(self):
for val in self._values:
yield val
Но я не могу на самом деле придумать причину, по которой вам нужно сделать это вместо использования iter ()
def __iter__(self):
return iter(self._values)
Или более общего:
def __iter__(self):
for x in self._values:
yield x
-121--4109577- Таким образом, вы можете сделать что-то вроде "ForSourceType.AddFormatter () в профиле, и теперь blammo! Теперь все ваши десятичные знаки отображаются как деньги. Распознаватели предназначены исключительно для пользовательского сопоставления членов.
Хорошо, я думаю, что я понял это:
с иваламформформом
, вход в метод FormatValue ()
- это фактическое значение. (Хорошо, технически, это объект VIALLCONTEXT
, который позволяет получить значение, используя свойство SourceValue
, но вы получаете идею).
С Valueresolver
, вход в метод Resolvecore ()
метода является весь источник (не только исходное значение).
Итак, если вы хотите сделать какую-то конверсию между исходным значением и значением назначения, ивалауэрфорформизм
будет работать только в том случае, если тип назначения является строкой
и Valueresolver
будет работать только в том случае, если метод Resolvecore ()
метод «знает», какое свойство использовать (что не будет так, если ваш Resolver является общем назначением, т. Е. Не применяется к определенной собственности).
Обходной путь
К счастью, всегда есть mapfrom
, что обеспечивает гибкость, которая отсутствует как разрешетелей, так и для формшестей.
Интерфейс преобразователя
Я закончил писать интерфейс просто и гибко справляться с тем, что я полагаю, является очень распространенным сценарием: двусторонние преобразования ...
public interface ITwoWayConverter<TInput, TOutput>
{
TOutput ConvertForward(TInput value);
TInput ConvertBackward(TOutput value);
}
Пример преобразователя:
public class PhoneNumberToString : ITwoWayConverter<long, string>
{
public string ConvertForward(long value)
{
return string.Format("{0:(###) ###-####}", Convert.ToInt64(value));
}
public long ConvertBackward(string value)
{
return Convert.ToInt64(Regex.Replace(value, @"\D", string.Empty));
}
}
Пример использования:
Mapper.CreateMap<User, UserViewModel>()
.ForMember(dest => dest.PhoneNumber, opt => opt
.MapFrom(orig => new PhoneNumberToString().ConvertForward(orig.PhoneNumber)));
IvalueFormatter - это интерфейс, и может быть прикреплен к вашим существующим классам или используется в сочетании с той когда-либо библиотечной библиотекой, она выглядит как Valueresolver - это класс, который может иметь более широкий спектр использования ... в разных Слова, IvalueFormatter, вероятно, используется для того, чтобы помочь вам использовать ваши классы с библиотекой, из которой она пришла, а значение Resolver предназначен для того, чтобы помочь вам использовать их классы в вашем коде.