Можно всегда использовать свойство "DocumentStream" или "DocumentText". Для работы с документами HTML я рекомендую Пакет Гибкости HTML .
Nullable
может не реализовывать IComparable
, но наверняка int
реализует. И Nullable
всегда помещается в T
(например, при приведении к интерфейсу, например IComparable
, который является преобразованием бокса). Так что сравнение / сортировка свойств, допускающих значение NULL, не должно быть проблемой.
int? value = 1;
IComparable comparable = value; // works; even implicitly
Итак, проверка в примере вверху не работает должным образом. Попробуйте следующее:
Type interfaceType = prop.PropertyType.GetInterface("IComparable");
// Interface not found on the property's type. Maybe the property was nullable?
// For that to happen, it must be value type.
if (interfaceType == null && prop.PropertyType.IsValueType)
{
Type underlyingType = Nullable.GetUnderlyingType(prop.PropertyType);
// Nullable.GetUnderlyingType only returns a non-null value if the
// supplied type was indeed a nullable type.
if (underlyingType != null)
interfaceType = underlyingType.GetInterface("IComparable");
}
if (interfaceType != null)
// rest of sample
Еще одно дополнение: если вы хотите, чтобы значения NULL также работали (как строковые, так и типы, допускающие значение NULL), вы можете попробовать эту повторную реализацию SortCore (...)
:
protected override void ApplySortCore(PropertyDescriptor prop, ListSortDirection direction)
{
IEnumerable<MyClass> query = base.Items;
if (direction == ListSortDirection.Ascending)
query = query.OrderBy( i => prop.GetValue(i) );
else
query = query.OrderByDescending( i => prop.GetValue(i) );
int newIndex = 0;
foreach (MyClass item in query)
{
this.Items[newIndex] = item;
newIndex++;
}
this.OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1));
}
Нет необходимости искать IComparable
напрямую, просто позвольте методам сортировки разобраться в этом.
При сравнении типов, допускающих значение NULL, можете ли вы сделать что-то вроде этого ...
Int32? val1 = 30;
Int32 val2 = 50;
Int32 result = (val1 as IComparable).CompareTo(val2);