假设我有Dictionary
这样:
Dictionary<string, string> values = new Dictionary<string, string>()
{
{ "Name" , "John Smith"},
{ "Age", "34"}
};
现在我想从该字典创建类型并在运行时使用值初始化它,以便我能够使用反射访问它的属性。
对于此示例,我希望对象的属性Name
等于"Jon Smith"
,Age
等于34
。
编辑: 我需要这个来比较两个对象与语义比较库,如TestApi。由具有强类型
的其他代码创建的第一个对象class Person
{
public string Name {get; set;}
public int Age { get; set;}
}
和其他我需要从其他来源创建像xml文件(但不是必需的)。要比较的类型仅在运行时才知道。
答案 0 :(得分:10)
如果您使用的是C#4,则可以使用dynamic
和ExpandoObject
- 这不是实际上创建新类型,但在某些情况下它足够接近:
IDictionary<string, object> foo = new ExpandoObject();
foreach (var pair in values)
{
foo[pair.Key] = pair.Value;
}
dynamic d = foo;
string name = d.Name;
string age = d.Age; // This will still be a string, not an int
编辑:我错过了你想用反射访问数据。使用反射是一种有效地将类型视为地图的方式 - 您已经 以该形式获得它。为什么不直接访问字典?唯一的好处是,如果您希望能够使用带有反射的某些类型,而有些带有字典。在这种情况下,我将创建一个具有两个实现的通用接口 - 其中一个从字典中获取值,其中一个使用反射。这比在飞行中创建类型要容易得多(这是可能的,但不是很有趣)。