问题

  • 假如我有一个匿名类型或者动态类型,它的结构定义和我的一个强类型的结构是一致的,请问 C# 中是否有内置的方法可以强转为指定 强类型

方案一:AutoMapper

方案二:先序列化为中间格式,然后在后续的某个时刻再反序列化为正确的类型

  • 你可以先序列化为中间格式,然后在后续的某个时刻再反序列化为正确的类型,虽然这不是高效率的方式,但肯定是非常灵活的实现方式

  • 强类型

    1. class C
    2. {
    3. public string A;
    4. public int B;
    5. }
  • 匿名类型

    1. // Untyped instance
    2. var anonymous = new {
    3. A = "Some text",
    4. B = 666
    5. };

json

  • 接下来你可以将 匿名类型 转化为中间格式,然后再反序列化前面定义的强类型

    1. static void Main(string[] args)
    2. {
    3. var json = JsonConvert.SerializeObject(anonymous);
    4. var c = JsonConvert.DeserializeObject<C>(json);
    5. }

Dictionary

  1. Dictionary<string, object> dict =
  2. obj.GetType()
  3. .GetProperties()
  4. .ToDictionary(p => p.Name, p => p.GetValue(obj, null));
  5. List<MyType> items = anonymousType.Select(t => new MyType(t.Some, t.Other)).ToList();

动态类型 和 强类型 之前有继承链关系

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. var person = new Person();
  6. dynamic dy = person;
  7. var person2 = (Person)dy;
  8. Console.ReadLine();
  9. }
  10. }
  11. public class Person
  12. {
  13. public string Name { get; set; }
  14. public int Age { get; set; }
  15. }