Sto provando a creare un metodo generico che restituirà un predicato per trovare elementi in un documento XML.C'è un modo per fare questo tipo di casting in un predicato C#
Fondamentalmente qualcosa di simile:
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.");
}
}
L'unica cosa è che questo non può essere compilato. Il problema è in parte (T)x.Attribute(criterion.PropertyName)
in cui il compilatore indica:
non può lanciare l'espressione di tipo 'System.Xml.Linq.XAttribute' di digitare 'T'
Attualmente ho due metodi che sono identici tranne che uno getta al doppio e l'altro al decimale. Mi piacerebbe davvero non avere quel tipo di duplicazione.
ciò che è 'Criterion'? –
@ DanielA.White: è una classe personalizzata che contiene i dati per l'espressione booleana. PropertyName è una stringa che rappresenta il nome dell'attributo nel nodo xml con cui sto confrontando e PropertyValue è un oggetto con il valore che sto cercando. –