Статическое дочернее поле в методе родителя - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть несколько DTO с одним из родителей.У этого родителя есть универсальный метод для создания любого его потомка (использует отражение).Каждый из этих DTO имеет конфигурацию (словарь).Я могу передать словарь через параметры в методе создания, но каждый дочерний тип имеет одинаковую конфигурацию, поэтому я хотел бы сделать его статическим и хранить в дочерних.Я обнаружил здесь: Доступ к статическому свойству потомка в родительском методе , что это может быть неисправный дизайн.Это в моем случае?Нужно ли передавать конфигурацию через параметр или, возможно, сохранять ее где-то еще?

Пример:

public class Parrent
{
    public static T Create<T>(string[] fields, Dictionary<string, bool> config) 
      where T : Parrent
    {
        var result = Activator.CreateInstance<T>();
        // filling fields using config
        return result
    }
}

РЕДАКТИРОВАТЬ:

Вот как работает конфигурация:

public class Child1 : Parrent
{
    public string Child1String;
    public DateTime Child1DateTime;
}

public class Child2 : Parrent
{
    public int Child2Int;
    public string Child2String;
    public TimeSpan Child2TimeSpan;
}

и словарь (в нем указано, какие поля я могу игнорировать (например, потому что они будут пустыми), и он задан в классе обработки из файла конфигурации):

- Child1:

    "Child1String": true,
    "Child1DateTime": true,

- Child2

    "Child2Int": true,
    "Child2String": false,
    "Child2TimeSpan": true,

1 Ответ

0 голосов
/ 20 сентября 2018

Класс не должен предполагать ничего о своих наследниках, кроме того, что он явно обязывает в определении типа.

Использование «отражения» определенно является «запахом кода», чтобы родитель мог взаимодействовать со своими потомками.,Это звучит как способ подтолкнуть во время выполнения то, что должно быть статическими проблемами проектирования.

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

public class Parent
{
    public string PropertyParentControls { get; protected internal set; }

    static internal T ReadConfigItem<T>(
            string name,
            IReadOnlyDictionary<string, dynamic> configuration)
    {
        if (configuration.TryGetValue(name, out var configValue))
        {
            return configValue; 
        }
        else
        {
            return default(T);
        }
    }

    virtual internal void FillConfig(IReadOnlyDictionary<string, dynamic> configuration)
    {
        this.PropertyParentControls =
            ReadConfigItem<string>("PropertyParentControls", configuration);    
    }   
}

public sealed class Child : Parent
{
    public int PropertyChildControls { get; private set; }

    override internal void FillConfig(IReadOnlyDictionary<string, dynamic> configuration)
    {
        base.FillConfig(configuration); // because the Child wants the Parents help.
        this.PropertyChildControls = 
            ReadConfigItem<int>("PropertyChildControls", configuration);
    }
}
...