I’m trying to create a generic method that will return a predicate to find elements in an XML document.
Basically something like this:
private static Func<XElement, bool> GetPredicate<T>(Criterion criterion)
{
switch (criterion.CriteriaOperator)
{
case CriteriaOperator.Equal:
return x => (T)x.Attribute(criterion.PropertyName) ==
(T)(criterion.PropertyValue);
case CriteriaOperator.GreaterThan:
return x => (T)x.Attribute(criterion.PropertyName) >
(T)(criterion.PropertyValue);
case CriteriaOperator.GreaterThanOrEqual:
return x => (T)x.Attribute(criterion.PropertyName) >=
(T)(criterion.PropertyValue);
case CriteriaOperator.LessThan:
return x => (T)x.Attribute(criterion.PropertyName) <
(T)(criterion.PropertyValue);
case CriteriaOperator.LessThanOrEqual:
return x => (T)x.Attribute(criterion.PropertyName) <=
(T)(criterion.PropertyValue);
case CriteriaOperator.NotEqual:
return x => (T)x.Attribute(criterion.PropertyName) !=
(T)(criterion.PropertyValue);
default:
throw new ArgumentException("Criteria Operator not supported.");
}
}
Only thing is that this doesn’t compile. The problem is on the (T)x.Attribute(criterion.PropertyName) part where the compiler indicates:
Cannot cast expression of type ‘System.Xml.Linq.XAttribute’ to type
‘T’
Currently I have two methods that are identical except that one casts to double and the other one to decimal. I would really like not to have that kind of duplication.
The XAttribute Class defines several conversion operators. However,when casting to a generic type parameter
T, these operators are not taken into consideration.What you can do is construct the lambda expression at runtime as follows:
Usage: