Вам нужно указать, как вы собираетесь конвертировать XElement
в экземпляр T
.В настоящее время ваш код просто не будет работать, если ServiceAccount
уже не имеет явного преобразования из XElement
.
Возможно, вы захотите иметь соглашение о наличии статического метода FromXElement
в каждом типе сущности - вы можетезатем вызовите это из отражения или даже получите словарь:
private static readonly Dictionary<Type, Delegate> Converters =
new Dictionary<Type, Delegate> {
{ typeof(ServiceAccount),
(Func<XElement, ServiceAccount>) ServiceAccount.FromXElement },
{ typeof(OtherEntity),
(Func<XElement, OtherEntity>) OtherEntity.FromXElement },
};
Затем вы напишите что-то вроде:
public IQueryable<TEntity> GetQuery<TEntity>() where TEntity : class
{
Delegate converter;
if (!Converters.TryGetValue(typeof(TEntity), out converter))
{
throw new InvalidOperationException("...");
}
Func<XElement, TEntity> realConverter = (Func<XElement, TEntity>) converter;
var filename = GetEntityFileName<TEntity>();
var doc = XDocument.Load(filename);
return doc.Descendants(entityName)
.Select(realConverter)
.AsQueryable();
}
Не совсем понятно, почему вы используете IQueryable<T>
здесь, кстати ... что-то не так с просто IEnumerable<T>
?