powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вернуть нужный экземпляр generic класса
17 сообщений из 17, страница 1 из 1
Вернуть нужный экземпляр generic класса
    #38155408
Andr___!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день всем, есть одна задачка, застрял по полной

есть базовый репозиторий
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public abstract class RepositoryBase<TEntity>:IReadWriteRepositoryBase<TEntity> where TEntity : EntityBase<TEntity>
{
  ........
  different methods
   ......
  public void Save(List<TEntity> list)
  {
   ...
   }
}


есть Конкретный репозиторий
Код: c#
1.
2.
3.
4.
public class ClientRepository:  RepositoryBase<Client>
{

}



и таких репозиториев десятки. Вот задачка - нужно сделать Класс которй бы имел метод который бы принимал входящим параметром Тип/объект типа /либо стринговый ключ и возвращал конкретный репозиторий, что то типа
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 public static class RepositoryFactory {

      public static RepositoryBase<Что здесь писать пока не допонял> GetRepository(Type TEntity) {
       //TODO get the right repo for this type

       if (TEntity == typeof(Client))
          return new ClientRepository();

       return null;
       //TODO return the interface
       //  return repo as businessLogic.Repository.IReadWriteRepositoryBase<TEntity>;
    }



Пока что сломал голову, и прихожу к выводу что вроде как нельзя это сделать..Посоветуйте что-то пожалуйста, может есть какоето другое решение, рефлексия и т.д.. Но так как по времени сжат принимается любое хардкодное временное решение.
Заранее спасибо!
...
Рейтинг: 0 / 0
Вернуть нужный экземпляр generic класса
    #38155427
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andr___!,

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
public interface IRepository
{
....
}

public interface IReadWriteRepositoryBase<TEntity> : IRepository
{
....
}



Код: c#
1.
public static IRepository GetRepository(Type TEntity) {
...
Рейтинг: 0 / 0
Вернуть нужный экземпляр generic класса
    #38155462
Andr___!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, спасибо, но как быть с методом Save ?
Код: c#
1.
2.
 var repo = RepositoryFactory.GetRepository(typeof(Client));
repo. ?????
...
Рейтинг: 0 / 0
Вернуть нужный экземпляр generic класса
    #38155472
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы уж определитесь... Генерики или рефлекшен...
...
Рейтинг: 0 / 0
Вернуть нужный экземпляр generic класса
    #38155476
Andr___!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я же вам говорю, нужно возвращать кокретный репозиторий. с его методами по какомуто ключу, сейчас уже не имеет особого значения как, важен результат
...
Рейтинг: 0 / 0
Вернуть нужный экземпляр generic класса
    #38155495
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andr___!, не пойму... смысла фразы ... с его методами Включите google... может просмотр ссылок, найденных по словам C# Generic Repository чем-то поможет гиганту мысли?
...
Рейтинг: 0 / 0
Вернуть нужный экземпляр generic класса
    #38155508
Andr___!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемый buser,
я в гугле уже искал, иначе бы я не искал свой пароль к этому форуму и не городил бы всю эту тему, вы можете чем то помочь ?
...
Рейтинг: 0 / 0
Вернуть нужный экземпляр generic класса
    #38155522
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dictionary<T,IRepsitory<T>>
...
Рейтинг: 0 / 0
Вернуть нужный экземпляр generic класса
    #38155527
beg-in-er
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andr___!Да, спасибо, но как быть с методом Save ?
[/src]
А статическим не пробывали его сделать &
...
Рейтинг: 0 / 0
Вернуть нужный экземпляр generic класса
    #38155532
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andr___!Добрый день всем, есть одна задачка, застрял по полной

есть базовый репозиторий
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public abstract class RepositoryBase<TEntity>:IReadWriteRepositoryBase<TEntity> where TEntity : EntityBase<TEntity>
{
  ........
  different methods
   ......
  public void Save(List<TEntity> list)
  {
   ...
   }
}


есть Конкретный репозиторий
Код: c#
1.
2.
3.
4.
public class ClientRepository:  RepositoryBase<Client>
{

}



и таких репозиториев десятки. Вот задачка - нужно сделать Класс которй бы имел метод который бы принимал входящим параметром Тип/объект типа /либо стринговый ключ и возвращал конкретный репозиторий, что то типа
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 public static class RepositoryFactory {

      public static RepositoryBase<Что здесь писать пока не допонял> GetRepository(Type TEntity) {
       //TODO get the right repo for this type

       if (TEntity == typeof(Client))
          return new ClientRepository();

       return null;
       //TODO return the interface
       //  return repo as businessLogic.Repository.IReadWriteRepositoryBase<TEntity>;
    }



Пока что сломал голову, и прихожу к выводу что вроде как нельзя это сделать..Посоветуйте что-то пожалуйста, может есть какоето другое решение, рефлексия и т.д.. Но так как по времени сжат принимается любое хардкодное временное решение.
Заранее спасибо!

через рефлекшн ищи, у кого базовым является твой generic с параметром entity, его и создавай.

это если работвть с тем что есть
...
Рейтинг: 0 / 0
Вернуть нужный экземпляр generic класса
    #38155535
Andr___!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beg-in-erAndr___!Да, спасибо, но как быть с методом Save ?
[/src]
А статическим не пробывали его сделать &
нет не пробовал. этого не нужно..Вы себе представляете что произойдёт )) проекту 10 лет, и во скольких местах вызывается Save
Save должен как раз быть экземплярным
...
Рейтинг: 0 / 0
Вернуть нужный экземпляр generic класса
    #38155570
Andr___!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buserDictionary<T,IRepsitory<T>>

то есть позаполнять этот дикшинери в моей фабрике, но потом надо вернуть конкретный репозиторий. и фабрика и метод который возвращает его, не должны быть Generic
...
Рейтинг: 0 / 0
Вернуть нужный экземпляр generic класса
    #38155596
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну сделайте мапу в xml конфиге между типом ентити и типом репозитория в фактори - резолвите, как создать экземпляр объекта по его типу - гугл вам в помощь...... и вообще не совсем ясно - зачем менять что-то в старом проекте ни чего в нем не меняя, а токмо наворачивая новых граблей?
...
Рейтинг: 0 / 0
Вернуть нужный экземпляр generic класса
    #38155665
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andr___!,

а вообще с этим
Код: c#
1.
where TEntity : EntityBase<TEntity>


вы хлебнёте по полной
...
Рейтинг: 0 / 0
Вернуть нужный экземпляр generic класса
    #38155732
Andr___!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pationAndr___!,

а вообще с этим
Код: c#
1.
where TEntity : EntityBase<TEntity>


вы хлебнёте по полной

Это я уже понял, всё равно всем большое спасибо!
...
Рейтинг: 0 / 0
Вернуть нужный экземпляр generic класса
    #38155766
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
затычка на пять копеек
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication30
{
    class Program
    {
        static void Main(string[] args)
        {
            var e1t = Create<E1>();
            var e2t = Create<E2>();
            var e3t = Create<E3>();
        }

        public static MyBaseGeneric<T> Create<T>()
            where T : E
        {
            foreach (var a in AppDomain.CurrentDomain.GetAssemblies())
            {
                var type = a.GetTypes().FirstOrDefault(t => t.BaseType == typeof(MyBaseGeneric<T>));

                if (type != null)
                    return (MyBaseGeneric<T>)Activator.CreateInstance(type);
            }

            throw new InvalidOperationException();
        }
    }

    public class E {}

    public class E1 : E { }
    public class E2 : E { }
    public class E3 : E { }

    public class MyBaseGeneric<T> where T : E { }

    public class MyDerivedE1 : MyBaseGeneric<E1> { }
    public class MyDerivedE2 : MyBaseGeneric<E2> { }
    public class MyDerivedE3 : MyBaseGeneric<E3> { }

}


...
Рейтинг: 0 / 0
Вернуть нужный экземпляр generic класса
    #38156010
Varcom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andr___!,

Примерно так:
Код: c#
1.
2.
3.
4.
5.
6.
public static T GetRepository<T>() where T: RepositoryBase<TEntity>, new()
{
  T obj = new T();
  // initialize obj
  return obj;
}
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вернуть нужный экземпляр generic класса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]