我有一些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,
答案 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);
}
}