Создание класса на основе строкового значения или группирование набора классов без использования интерфейса - PullRequest
0 голосов
/ 01 марта 2020

У меня есть некоторый код, который получает строку - в зависимости от того, какой строкой является экземпляр класса, например, если его "customer" он выполняет новый CustomerData () et c. Будет 10-30 различных строковых значений, и у каждого есть связанный класс, для которого нужно создать экземпляр:

Я действительно подумал об использовании словаря для решения этой проблемы:

  public IData data; //the classes are currently in an interface but this is looking impractical due to differing methods.

  data = dataLookup["dataType"];

  dataLookup = new Dictionary<string, **what data type is this?**>
        {
            { "customer", new CustomerData() },
            { "company", new CompanyData() }
            ...etc 10-30 rows... 
        };

Проблема в том, что я не знаю, как установить тип данных в словаре - я не думаю, что добавление всех классов в интерфейс является ответом. Хотя все классы связаны между собой (все они являются «данными» для приложения), только около половины методов в каждом классе данных одинаковы, остальные методы уникальны для каждого класса данных. Я читал об интерфейсах, что я мог бы просто добавить неиспользуемые методы в каждый класс и не использовать их, но это звучит немного грязно.

Что было бы самым чистым решением для создания экземпляра правильного класса на основе строковое значение?

1 Ответ

1 голос
/ 01 марта 2020

Поскольку все ваши классы имеют конструкторы без параметров (согласно комментариям), в качестве опции вы можете управлять словарем string в качестве ключа и Type в качестве значения (вместо конкретного экземпляра).

var dict = new Dictionary<string, Type>()
{
    { "customer", typeof(CustomerData) },
    { "company", typeof(CompanyData) },
};

И используйте его следующим образом, получите тип по ключу из словаря и создайте экземпляр этого типа. Но этот экземпляр имеет тип Object, поскольку вы не можете использовать тип, известный во время выполнения во время компиляции. Возможный способ - использовать Convert.ChangeType и сохранить результат в переменной типа dynamic

var type = dict["customer"];
var data = Activator.CreateInstance(type);
dynamic result = Convert.ChangeType(data, type);
.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...