powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / c# фабрика
7 сообщений из 7, страница 1 из 1
c# фабрика
    #39605251
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

Помогите пожалуйста разобраться с фабрикой классов. Задача: по имеющему типу Entity, создать новый экземпляр класса модели.

Код: c#
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.
46.
47.
public abstract class ConMvvm<TEntity> where TEntity : class
{
    public Type GetEntity { get { return typeof(TEntity); } }
}
public interface IView
{
}
public abstract class AbstCont
{
    public abstract IView CreateFactory(Type sender);
}	
public class EntityA
{
    public int Id { get; set; }
}
public class EntityB
{
    public int Id { get; set; }
}

public class A : ConMvvm<EntityA>, IView
{
    public string Caption { get; set; }
    public A()
    {
        Caption = typeof (A).Name;
    }
}
public class B : ConMvvm<EntityB>, IView
{
    public string Caption { get; set; }
    public B()
    {
        Caption = typeof (B).Name;
    }
}	
public class ConFactory : AbstCont
{
    public override IView CreateFactory(Type sender) 
    {
        return (IView)Activator.CreateInstance(sender);
    }
}	
	
var type = typeof(EntityB); // Тип сущности "EntityB"
AbstCont x = new ConFactory();
var classX = x.CreateFactory(type); // Нужно создать класс "B"
...
Рейтинг: 0 / 0
c# фабрика
    #39605267
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно как-то так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
public class ConFactory : AbstCont
{
  public override IView CreateFactory(Type sender)
  {
    var generic = typeof (ConMvvm<>).MakeGenericType(sender);
    var derived = AppDomain.CurrentDomain.GetAssemblies()
      .SelectMany(a => a.GetTypes())
      .FirstOrDefault(t => generic.IsAssignableFrom(t) && typeof (IView).IsAssignableFrom(t));
    if (derived==null)
      throw new ApplicationException("Class not found");
    return (IView)Activator.CreateInstance(derived);
  }
}


если известно, в какой сборке находится тип - то так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
public class ConFactory : AbstCont
{
  public override IView CreateFactory(Type sender)
  {
    var generic = typeof(ConMvvm<>).MakeGenericType(sender);
    var derived = Assembly.GetEntryAssembly()
      .GetTypes()
      .FirstOrDefault(t => generic.IsAssignableFrom(t) && typeof(IView).IsAssignableFrom(t));
    if (derived == null)
      throw new ApplicationException("Class not found");
    return (IView)Activator.CreateInstance(derived);
  }
}


или так
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
public class ConFactory : AbstCont
{
  public override IView CreateFactory(Type sender)
  {
    var generic = typeof(ConMvvm<>).MakeGenericType(sender);
    var derived = sender.Assembly
      .GetTypes()
      .FirstOrDefault(t => generic.IsAssignableFrom(t) && typeof(IView).IsAssignableFrom(t));
    if (derived == null)
      throw new ApplicationException("Class not found");
    return (IView)Activator.CreateInstance(derived);
  }
}


или даже так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
public class ConFactory : AbstCont
{
  readonly HashSet<Type> _types = new HashSet<Type>();
  public void Register(Type type)
  {
    _types.Add(type);
  }

  public override IView CreateFactory(Type sender)
  {
    var generic = typeof (ConMvvm<>).MakeGenericType(sender);
    var derived = _types
      .FirstOrDefault(t => generic.IsAssignableFrom(t) && typeof (IView).IsAssignableFrom(t));
    if (derived==null)
      throw new ApplicationException("Class not found");
    return (IView)Activator.CreateInstance(derived);
  }
}


Код: c#
1.
2.
3.
4.
5.
var type = typeof(EntityB);
var x = new ConFactory();
x.Register(typeof(A));
x.Register(typeof(B));
var classX = x.CreateFactory(type);
...
Рейтинг: 0 / 0
c# фабрика
    #39605274
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Отлично! Вы мне очень помогли! Спасибо!
...
Рейтинг: 0 / 0
c# фабрика
    #39605285
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: c#
1.
2.
3.
var generic = typeof(ConMvvm<>).MakeGenericType(sender);
var derived = sender.Assembly.GetTypes().FirstOrDefault(t => generic.IsAssignableFrom(t) && typeof(IView).IsAssignableFrom(t));
if (derived == null)


Почему-то возвращает null
...
Рейтинг: 0 / 0
c# фабрика
    #39605288
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А sender и искомый тип находятся в одной сборке?
...
Рейтинг: 0 / 0
c# фабрика
    #39605289
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сон Веры ПавловныА sender и искомый тип находятся в одной сборке?

В разных
...
Рейтинг: 0 / 0
c# фабрика
    #39605293
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извиняюсь!
Это я ошибся - указал не те классы в регистраторе.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / c# фабрика
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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