【发布时间】:2011-07-21 19:17:40
【问题描述】:
我有两个这样的课程:
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% 的情况下,您必须在构造后初始化它。
我不想将初始化代码移动到派生类中,字符串到业务对象的转换除外。
我必须使用工厂吗?或者在基构造函数中查看派生类的属性 names 是否安全? (不要关心它们的值并且它们没有被初始化,只需要名称)。
或者有没有更好的方法来提供字符串字典和具体业务对象之间的外观?
编辑: 这是 .net 3.5,所以没有 System.Dynamic 会使这变得微不足道:(
编辑 2: 在查看了答案并进一步思考之后,我想我的问题现在真的可以归结为:从基础构造函数调用 GetType().GetProperties()为了获得属性的名称,以及它们是否用特定的属性装饰安全?
【问题讨论】:
标签: c# .net reflection