У меня есть класс, который имеет свойство общего типа, как показано ниже. Тип T может быть любое число (короче говоря, целый, дробный ...)Общий способ обработки чисел без явного преобразования
public class EqualFilter <T> : Filter {
private T _value;
public override T Value {
get {
return _value;
}
set {
if (!EqualityComparer<T>.Default.Equals(_value, value)) {
_value = value;
RaiseFilteringChanged();
}
}
}
.....
}
Теперь у меня есть класс клиента, который имеет «String», который должен быть передан выше сеттера. Теперь, когда вы устанавливаете значение в указанном выше параметре, тип T уже определен во время выполнения, и я могу получить этот тип как тип T в моем клиенте. Можно ли преобразовать строку в соответствующий тип, как определено EqualFilter, в клиентскую программу? Нечто подобное, что не работает
Type T = filter.getFilterType();
filter.Value = (T) myTextBox.Text;
Приведенный ниже код работает, но он будет включать в себя, если-то еще для всех типов, которые могут быть числовыми.
Type T = filter.getFilterType();
if (T == typeof(int)) {
filter.Value = Int32.Parse(myTextBox.Text);
} else if() {
....
}
Короче говоря, я не уверен, как лучше подойти к проблеме.
Не можете ли вы поставить ограничение типа на 'T'? http://msdn.microsoft.com/en-us/library/d5x73970.aspx – Bazzz
Я не уверен, как подойти с предложением, предоставленным вами. Не могли бы вы предоставить мне некоторые подробности. Также, если я ставлю ограничение класса на T, это будет препятствовать производительности, потому что значение фильтра будет использоваться при сравнении значений для относительно большого количества строк. – Jatin
это просто ограничение на типы, которые 'T' принимает. Ваш текущий код принимает 'T' как ЛЮБОЙ тип, вы можете ограничить его определенным интерфейсом и использовать все ваши принятые типы для реализации этого интерфейса. Это немного неудобно с примитивными типами, но «IComparable» может быть хорошим: 'где T: IComparable'. Вам не нужно будет отличать 'T' до фактического типа перед сравнением, потому что EVERY' T', который заканчивается в вашем методе, является 'IComparable', поэтому вы можете смело применить его к' IComparable' и использовать метод 'Compare': '((IComparable) T) .Compare();' а не все ваши разные роли. – Bazzz