Есть интерфейсы для некоторых операций на числовых типах, как интерфейсы IComparable<T>
, IConvertible
и IEquatable<T>
. Можно указать, что, чтобы получить определенную функциональность:
public class MaxFinder<T> where T : IComparable<T> {
public T FindMax(IEnumerable<T> items) {
T result = default(T);
bool first = true;
foreach (T item in items) {
if (first) {
result = item;
first = false;
} else {
if (item.CompareTo(result) > 0) {
result = item;
}
}
}
return result;
}
}
Вы можете использовать делегат расширить класс с конкретными операциями типа:
public class Adder<T> {
public delegate T AddDelegate(T item1, T item2);
public T AddAll(IEnumerable<T> items, AddDelegate add) {
T result = default(T);
foreach (T item in items) {
result = add(result, item);
}
return result;
}
}
Использование:
Adder<int> adder = new Adder<int>();
int[] list = { 1, 2, 3 };
int sum = adder.AddAll(list, delegate(int x, int y) { return x + y; });
Вы можете также магазин делегаты в классе и имеют разные фабричные методы, которые устанавливают делегаты для определенного типа данных. Таким образом, код типа специфический только в заводских методах.
Они не работают в этом сценарии, но когда вы работаете с Generics, хорошо знать «ограничения общего типа». http://msdn.microsoft.com/en-us/library/d5x73970%28VS.80%29.aspx – STW
(ответил на комментарий) –
Отметьте этот пост здесь http://stackoverflow.com/questions/32664/c- generic-constraint-for-only-integers – David