Есть базовый класс
public abstract class Session
{
public abstract SessionType SessionType { get; }
}
И есть куча его наследников, возвращающих нужный тип SessionType.
Каждому типу строго соответствует один наследник.
Вопрос:
Как создать экземпляр нужного потомка зная тип.
ПС.
Понятно, что можно сделать метод по свичу создающий потомков.
Но тогда при каждом создании нового типа нужно будет добавлять новую инициализацию объекта.
Можно ли это сделать более простым способом?
Ответ
Большое спасибо за ответы. Оба ответа мне помогли.
Решил задачу немного другим способом, отличным от обоих предложенных.
Точнее, соединил их в одно решение.
Идея:
Для каждого класса-потомка устанавливается атрибут.
Потом сканируем потомков и определяем по атрибуту нужный тип
Создаем экземпляр.
Реализация:
using System;
using System.Linq;
using System.Reflection;
namespace TestAttrib
{
public enum SessionType
{
One
, Two
}
public abstract class Session
{
public abstract SessionType SessionType { get; }
public static Session construct(SessionType sessionType)
{
Type typeSession = typeof(Session);
Type type = Assembly.GetAssembly(typeSession).GetTypes().SingleOrDefault(t => t.IsSubclassOf(typeSession)
&& (t.GetCustomAttribute(typeof(SessionTypeAttribute)) as SessionTypeAttribute).SessionType == sessionType
);
if (type != null)
{
return (Session)Activator.CreateInstance(type);
}
return null;
}
}
[SessionType(SessionType.One)]
public class Session_One : Session
{
public override SessionType SessionType => SessionType.One;
}
[SessionType(SessionType.Two)]
public class Session_Two : Session
{
public override SessionType SessionType => SessionType.Two;
}
[AttributeUsage(AttributeTargets.Class)]
public class SessionTypeAttribute : Attribute
{
public SessionTypeAttribute(SessionType sessionType)
{
SessionType = sessionType;
}
public SessionType SessionType { get; }
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Session.construct(SessionType.One).ToString()); //Выведет TestAttrib.Session_One
Console.WriteLine(Session.construct(SessionType.Two).ToString()); //Выведет TestAttrib.Session_Two
Console.ReadLine();
}
}
}
Комментариев нет:
Отправить комментарий