检测代码中的动态类型

本文关键字:动态 类型 代码 检测 | 更新日期: 2023-09-27 18:03:39

我有一个方法,它接受泛型类型,对API执行rest查询,并返回一个序列化的对象。

它工作得很好,但是,我想扩展它以便在调用没有预定义类型的api时创建动态对象。

我让这个工作,唯一的变化是一个自定义的反序列化器,然而,我必须基本上复制/粘贴我的方法与不同的名称,因为我无法找到一种方法来检测动态类型。

一个小例子:

public T PerformQuery<T>()
{
  var deserializer = new JsonDeserializer();
  var res = deserializer.Deserialize<T>(response);
  return res;
}
public Dynamic PerformQueryDynamic()
{
  var deserializer = new DynamicJsonDeserializer();
  var res = deserializer.Deserialize<T>(response);
  return res;
}

我想要什么:

public T PerformQuery<T>()
{
  if(Typeof(T) == Typeof(Dynamic))
       var deserializer = new DynamicJsonDeserializer();         
  else
       var deserializer = new JsonDeserializer();
  var res = deserializer.Deserialize<T>(response);
  return res;
}

我在这里读过其他帖子,我明白为什么Typeof不能与Dynamic一起工作,但是,我想知道是否有什么可以在这里做我想做的?这个方法中还有其他的东西,比如Oauth调用和类似的东西,如果我能把它作为一个方法保存,那将会整洁得多。

…失败的解决方案,我正在考虑只是添加一个bool到构造函数,但是,似乎是浪费,如果有一个答案。

检测代码中的动态类型

没有dynamic类型。这都是围绕动态调用站点的语法糖。编译器会将下面的dynamic替换为object

我认为反序列化object(没有字段)是没有意义的,您可以通过使用

来解决这个问题:
public T PerformQuery<T>(string response)
{
    if (typeof(T) == typeof(object))
        return new DynamicJsonDeserializer().Deserialize<T>(response);
    return new JsonDeserializer().Deserialize<T>(response);
}

所以PerformQuery<object>将工作相同的PerformQuery<dynamic>,但就像我说的,这应该不是一个问题。