#c# #.net #oop #class
#c# #.net #ооп #класс
Вопрос:
У меня есть абстрактный класс, который наследуют другие классы.
public abstract class GenericAccess<TEntity>
{
public static IList<TEntity> GetObjectListFromArray(int[] IDs)
{
//Your help need is here.
}
}
public class Doors : GenericAccess<DoorEntity>
{
}
public class DoorEntity
{
public int Id { get; set; }
public string Name { get; set; }
}
Мне нужно создать универсальный метод, поэтому, когда я могу, например
IList<DoorEntity> Doors.GetObjectListFromArray(int[] {1,2,3,4,5});
он вернет IList, содержащий все объекты в нем с идентификатором свойства, загруженным с переданным значением. В приведенном выше примере он вернет список из 5 элементов в списке с загруженным идентификатором DoorEntity.
Комментарии:
1. Для этого можно использовать словарь<int, TEntity>.
2. откуда материализуются объекты DoorEntity? Хранятся ли они где-нибудь внутри объекта GenericAccess? Извлекаются ли они из базы данных?
3. DoorEntity загружается из базы данных с использованием Nhibernate Fluent.
Ответ №1:
Используйте интерфейс или базовый класс…
С интерфейсом:
public abstract class GenericAccess<TEntity> where TEntity : IEntity, new()
{
public static IList<TEntity> GetObjectListFromArray(int[] IDs)
{
return IDs.Select(id => new TEntity { Id = id }).ToList();
}
}
public class Doors : GenericAccess<DoorEntity>
{
}
public class DoorEntity : IEntity
{
public int Id { get; set; }
public string Name { get; set; }
}
public interface IEntity
{
int Id { get; set; }
string Name { get; set; }
}
С базовым классом:
public abstract class GenericAccess<TEntity> where TEntity : Entity, new()
{
public static IList<TEntity> GetObjectListFromArray(int[] IDs)
{
return IDs.Select(id => new TEntity { Id = id }).ToList();
}
}
public class Doors : GenericAccess<DoorEntity>
{
}
public class DoorEntity : Entity
{
}
public abstract class Entity
{
public int Id { get; set; }
public string Name { get; set; }
}
Комментарии:
1. Пожалуйста, приведите свой пример в ответе, а не за ссылкой!
2. Отлично сработало! Идеально! — Действительно интересно посмотреть на ваше решение!
3. Спасибо. Я вставил свой пример в ответ вместо ссылки на суть, извините за это.
Ответ №2:
Я не уверен, что это то, чего вы хотите, но вот что:
return from int id in Ids
select new TEntity (id);
Вам нужно будет исправить определение класса GenericAccess, чтобы добавить ограничение к универсальному параметру следующим образом:
public abstract class GenericAccess<TEntity> where TEntity : class, new
Хорошо, основываясь на ваших комментариях…
Используйте LINQ с NHibernate, чтобы получить сущности, похожие на:
return from int id in Ids
select Session.Query (...).Where (x => x.Id === id);
Ответ №3:
ваша функция может быть такой
public static IList<TEntity> GetObjectListFromArray(int[] IDs)
{
var r = new List<TEntity>();
foreach (var item in IDs)
{
var obj = typeof(TEntity).Assembly.CreateInstance(typeof(TEntity).FullName);
var p = obj.GetType().GetProperty("Id", System.Reflection.BindingFlags.IgnoreCase | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);
if (p != null)
{
p.SetValue(obj, item, null);
var m = r.GetType().GetMethod("Add");
m.Invoke(r, new object[] { obj });
}
}
return r;
}
}
и
IList<DoorEntity> r = Doors.GetObjectListFromArray(new int[] {1,2,3,4,5});