父级方法中的静态子字段

时间:2018-09-20 07:30:29

标签: c# dictionary inheritance dto

我有一些DTO和一位父母。该父级具有创建其子级的通用方法(使用反射)。这些DTO均具有配置(字典)。我可以在创建方法中通过参数传递字典,但是每个子类型都具有相同的配置,因此我想使其静态并存储在子中。我在这里找到:Accessing a static property of a child in a parent method,这可能是错误的设计。就我而言吗?我必须通过参数传递配置还是将其存储在其他位置?

示例:

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 :(得分:0)

除了明确定义类型的义务外,类不应继承其继承者的任何内容。

使用反射绝对是一种“代码气味”,以便父母可以与其孩子互动。这听起来像是一种将静态设计问题推向运行时的方法。

如果要使用一些配置填充子项,则需要确保这些属性在其实现中存在。另外,您可以将config方法抽象化给孩子们。将virtual用作两者的组合。

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);
    }
}