【问题标题】:System.RuntimeType doesn't contain a definition for Declared PropertiesSystem.RuntimeType 不包含声明属性的定义
【发布时间】:2016-11-15 11:01:21
【问题描述】:

我正在尝试将 Json 字符串反序列化为对象,在调试模式下它工作正常,但在发布模式下抛出错误,使得 System.RuntimeType 不包含声明属性的定义...

任何帮助将不胜感激

public T DeserializeJSon<T>(string jsonString)
    {
        dynamic dT = typeof(T);

        if (dT.Name.EndsWith("List"))
            dT = dT.DeclaredProperties[0].PropertyType.GenericTypeArguments[0];

        DataContractJsonSerializerSettings settings = new DataContractJsonSerializerSettings()
        {
            DateTimeFormat = new DateTimeFormat(DateTimeFormat),
            UseSimpleDictionaryFormat = true
        };
        DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T), settings);
        MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
        T obj = (T)ser.ReadObject(stream);
        stream.Dispose();

        return obj;
    }

【问题讨论】:

  • 你为什么要使用dyanmictypeof(T)总是返回一个System.Type 的实例,所以你应该使用类型而不是dynamic。跨度>
  • @HimBromBeere 你能说得更具体一些吗?我试过这样 Type dT = typeof(T);但 DeclaredProperties 是一种扩展方法,它会给出错误

标签: c# .net rest xamarin.android json.net


【解决方案1】:

DeclaredPropertiesSystem.TypeInfo 的成员,而不是System.Type 的成员,最不属于dyanmic

因此只需这样写:

Type dt = typeof(T);
if (dT.Name.EndsWith("List"))
    dT = dT.GetTypeInfo().DeclaredProperties.First().PropertyType.GenericTypeArguments[0];

我强烈建议不要使用dyanmic,除非你真的需要它(这里不是这样)。 Dynamic 只会将实际错误(在您的情况下访问不存在的成员)转移到运行时而不是编译器,这使得查找错误变得更加困难。这里的另一个原因是您已经知道表达式typeof(T) 的运行时类型,即总是 System.Type。为什么要使用dynamic 隐藏此信息?

【讨论】:

  • 感谢 A Ton @HimBromBeere 为我完成了这项工作。再次感谢您让我对动态有清晰的了解
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-29
  • 1970-01-01
  • 1970-01-01
  • 2017-07-06
相关资源
最近更新 更多