? Estoy intentando crear un método genérico que devuelva un predicado para encontrar elementos en un documento XML.¿Hay alguna manera de hacer este tipo de conversión en un predicado C#
Básicamente algo como esto:
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.");
}
}
Lo único es que esto no se compila. El problema está en la parte (T)x.Attribute(criterion.PropertyName)
donde el compilador indica:
no puede lanzar expresión de tipo 'System.Xml.Linq.XAttribute' para escribir
Actualmente tengo dos métodos 'T' que son idénticos, excepto que uno arroja al doble y el otro a decimal. Realmente me gustaría no tener ese tipo de duplicación.
lo que es 'Criterion'? –
@ DanielA.White: es una clase personalizada que contiene los datos para la expresión booleana. PropertyName es una cadena que representa el nombre del atributo en el nodo xml con el que estoy haciendo una coincidencia y PropertyValue es un objeto con el valor que estoy buscando. –