C# 是否可以将 动态或匿名类型 转成 强类型 ?

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 是否可以将 动态或匿名类型 转成 强类型 ?相关的知识,希望对你有一定的参考价值。

咨询区

  • ProfK

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

我知道可以使用 AutoMapper,但这有点重量级了,并且实现起来也稍微繁琐。

回答区

  • Grimace of Despair

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

  1. 强类型的类定义

// Typed definition
class C

    public string A;
    public int B;
  1. 匿名类实例

// Untyped instance
var anonymous = new 
    A = "Some text",
    B = 666
;

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

static void Main(string[] args)
        
            var json = JsonConvert.SerializeObject(anonymous);

            var c = JsonConvert.DeserializeObject<C>(json);
        

理论上来说,你也可以使用其他类型的序列化机制 binary serialization , XmlSerializer 或者其他 json 库。

  • jherax

可以先将 匿名类型 转为 Dictionary,参考如下代码:

Dictionary<string, object> dict = 
    obj.GetType()
      .GetProperties()
      .ToDictionary(p => p.Name,  p => p.GetValue(obj, null));

然后可以通过 Linq 的方式再反转为对象。

List<MyType> items = anonymousType.Select(t => new MyType(t.Some, t.Other)).ToList();

另外说一下,如果你的 动态类型强类型 之前有继承链关系,换句话说,如果是在运行时你将某一个强类型赋值给了动态类型,那么这一种情况下你是可以直接强转的,参考如下:

class Program
    
        static void Main(string[] args)
        
            var person = new Person();

            dynamic dy = person;

            var person2 = (Person)dy;

            Console.ReadLine();
        
    

    public class Person
    
        public string Name  get; set; 

        public int Age  get; set; 
    

点评区

这是一个比较有意思的问题,用 反射序列化 ,AutoMapper 都是些很好的 idea, 学习了。

以上是关于C# 是否可以将 动态或匿名类型 转成 强类型 ?的主要内容,如果未能解决你的问题,请参考以下文章

c# 读取json的问题,JObject不能强转成JArray

C#“动态”无法访问在另一个程序集中声明的匿名类型的属性

具有匿名类型的 C# LINQ 构建表达式

linQ 结果 匿名类型 用作 binding source的方法

go与C#的匿名类型判断比较

c#中怎么将string转换成int型