我有两个类,如下所示:
正如您所见,我希望我的基类构造函数知道我正在实例化的派生类的属性。
现在,这似乎是一个巨大的代码气味,让我更详细地解释一下我的意图,也许有更好的方法。
我有一个后端系统,存储键/值对,本质上是一个
换句话说,我只是重新发明了序列化,除了我不控制后端系统,而是使其非常轻松地工作。我不希望调用者在构造对象后调用
我不想将初始化代码移动到派生类中,除了字符串转业务对象转换之外。
我必须使用工厂吗?还是在基础构造函数中查看派生类的属性名称被认为是安全的?(不关心它们的值和它们是否已初始化,只需要名称)。
还是提供字典和具体业务对象之间的外观有更好的方法?
编辑:这是 .net 3.5,因此没有 System.Dynamic,这将使其平凡无奇 :(
编辑2:在查看答案并仔细思考后,我想我的问题现在归结为:从基础构造函数调用 GetType().GetProperties() 以获取属性的名称及其是否使用某些特定属性是安全的吗?
public abstract class MyBase
{
protected MyBase(){
Initialize();
}
protected IDictionary<string,string> _data;
private void Initialize() {
// Use Reflection to get all properties
// of the derived class (e.g., call new MyDerived() then
// I want to know the names "Hello" and "ID" here
var data = GetDataFromBackend(propertyNamesFromDerived);
_data = data;
}
}
public class MyConcrete : MyBase
{
public MyConcrete(){
// Possibly use Reflection here
Hello = _data["Hello"];
ID = new Guid(data["ID"]);
}
public string Hello {get;set;}
public Guid ID {get; set;}
}
正如您所见,我希望我的基类构造函数知道我正在实例化的派生类的属性。
现在,这似乎是一个巨大的代码气味,让我更详细地解释一下我的意图,也许有更好的方法。
我有一个后端系统,存储键/值对,本质上是一个
Dictionary<string,string>
。我想以一种抽象的方式处理此后端系统,使人们可以创建类,其属性是关键字进入后端系统。当他们构建此对象时,它将自动从该系统加载数据并将所有变量初始化为该数据。换句话说,我只是重新发明了序列化,除了我不控制后端系统,而是使其非常轻松地工作。我不希望调用者在构造对象后调用
Initialize()
,因为在100%的情况下,您必须在构造后初始化它。我不想将初始化代码移动到派生类中,除了字符串转业务对象转换之外。
我必须使用工厂吗?还是在基础构造函数中查看派生类的属性名称被认为是安全的?(不关心它们的值和它们是否已初始化,只需要名称)。
还是提供字典和具体业务对象之间的外观有更好的方法?
编辑:这是 .net 3.5,因此没有 System.Dynamic,这将使其平凡无奇 :(
编辑2:在查看答案并仔细思考后,我想我的问题现在归结为:从基础构造函数调用 GetType().GetProperties() 以获取属性的名称及其是否使用某些特定属性是安全的吗?
GetType().GetProperties()
是否安全,只是为了获取名称和属性 - 不再关心在基类中设置值。 - Michael Stum