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

есть базовый репозиторий
Код: 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
18.02.2013, 12:24
    #38155427
pation
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть нужный экземпляр generic класса
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
18.02.2013, 12:41
    #38155462
Andr___!
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть нужный экземпляр generic класса
Да, спасибо, но как быть с методом Save ?
Код: c#
1.
2.
 var repo = RepositoryFactory.GetRepository(typeof(Client));
repo. ?????
...
Рейтинг: 0 / 0
18.02.2013, 12:48
    #38155472
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть нужный экземпляр generic класса
Вы уж определитесь... Генерики или рефлекшен...
...
Рейтинг: 0 / 0
18.02.2013, 12:50
    #38155476
Andr___!
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть нужный экземпляр generic класса
Я же вам говорю, нужно возвращать кокретный репозиторий. с его методами по какомуто ключу, сейчас уже не имеет особого значения как, важен результат
...
Рейтинг: 0 / 0
18.02.2013, 12:58
    #38155495
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть нужный экземпляр generic класса
Andr___!, не пойму... смысла фразы ... с его методами Включите google... может просмотр ссылок, найденных по словам C# Generic Repository чем-то поможет гиганту мысли?
...
Рейтинг: 0 / 0
18.02.2013, 13:03
    #38155508
Andr___!
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть нужный экземпляр generic класса
Уважаемый buser,
я в гугле уже искал, иначе бы я не искал свой пароль к этому форуму и не городил бы всю эту тему, вы можете чем то помочь ?
...
Рейтинг: 0 / 0
18.02.2013, 13:11
    #38155522
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть нужный экземпляр generic класса
Dictionary<T,IRepsitory<T>>
...
Рейтинг: 0 / 0
18.02.2013, 13:13
    #38155527
beg-in-er
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть нужный экземпляр generic класса
Andr___!Да, спасибо, но как быть с методом Save ?
[/src]
А статическим не пробывали его сделать &
...
Рейтинг: 0 / 0
18.02.2013, 13:16
    #38155532
Lord British
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть нужный экземпляр generic класса
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
18.02.2013, 13:18
    #38155535
Andr___!
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть нужный экземпляр generic класса
beg-in-erAndr___!Да, спасибо, но как быть с методом Save ?
[/src]
А статическим не пробывали его сделать &
нет не пробовал. этого не нужно..Вы себе представляете что произойдёт )) проекту 10 лет, и во скольких местах вызывается Save
Save должен как раз быть экземплярным
...
Рейтинг: 0 / 0
18.02.2013, 13:41
    #38155570
Andr___!
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть нужный экземпляр generic класса
buserDictionary<T,IRepsitory<T>>

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

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


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

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


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

Это я уже понял, всё равно всем большое спасибо!
...
Рейтинг: 0 / 0
18.02.2013, 15:10
    #38155766
Lord British
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть нужный экземпляр generic класса
затычка на пять копеек
Код: 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
18.02.2013, 16:43
    #38156010
Varcom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть нужный экземпляр generic класса
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
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вернуть нужный экземпляр generic класса / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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