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

Den*_*sky 2 .net c# .net-4.0

假设我Dictionary喜欢这个:

Dictionary<string, string> values = new Dictionary<string, string>()
        {
            { "Name" , "John Smith"},
            { "Age", "34"}
        };
Run Code Online (Sandbox Code Playgroud)

现在我想从该字典创建类型并在运行时使用值初始化它,以便我能够使用反射访问它的属性.

对于这个例子,我想要属性Name等于"Jon Smith"Age等于的对象34.

编辑: 我需要这个比较两个对象与语义比较库,如TestApi.由具有强类型的其他代码创建的第一个对象

class Person 
{
    public string Name {get; set;}
    public int Age { get; set;}
} 
Run Code Online (Sandbox Code Playgroud)

和其他我需要从其他来源创建像xml文件(但不是必需的).要比较的类型仅在运行时才知道.

Jon*_*eet 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
Run Code Online (Sandbox Code Playgroud)

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