创建类型并在运行时初始化它

时间:2011-05-17 18:33:53

标签: c# .net .net-4.0

假设我有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文件(但不是必需的)。要比较的类型仅在运行时才知道。

1 个答案:

答案 0 :(得分:10)

如果您使用的是C#4,则可以使用dynamicExpandoObject - 这不是实际上创建新类型,但在某些情况下它足够接近:

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
编辑:我错过了你想用反射访问数据。使用反射是一种有效地将类型视为地图的方式 - 您已经 以该形式获得它。为什么不直接访问字典?唯一的好处是,如果您希望能够使用带有反射的某些类型,而有些带有字典。在这种情况下,我将创建一个具有两个实现的通用接口 - 其中一个从字典中获取值,其中一个使用反射。这比在飞行中创建类型要容易得多(这是可能的,但不是很有趣)。