Вы не можете сравнивать два T
с использованием ==
, но object.Equals()
должно работать.
Чтобы выполнить преобразование, вы можете использовать Convert.ChangeType()
:
case CriteriaOperator.Equal:
return x => object.Equals(
Convert.ChangeType(x.Attribute(criterion.PropertyName).Value, typeof(T)),
criterion.PropertyValue);
Проблема в том, что в некоторых случаях XML использует разные правила для преобразования (например, Double.PositiveInfinity
представляется как INF
).
Чтобы решить эту проблему, вы можете использовать XmlConvert
класс , который используется внутри операторов преобразования.За исключением того, что у него нет «универсального» метода, такого как Convert.ChangeType()
, поэтому вам придется создать свой собственный:
private static object Convert(string value, Type targetType)
{
if (targetType == typeof(double))
return XmlConvert.ToDouble(value);
…
throw new ArgumentException();
}
…
case CriteriaOperator.Equal:
return x => object.Equals(
Convert(x.Attribute(criterion.PropertyName).Value, typeof(T)),
criterion.PropertyValue);