Использование абстрактных классов в C#

#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});