System.RuntimeType不包含声明属性的定义

时间:2016-11-15 11:01:21

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

我正在尝试将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;
    }

1 个答案:

答案 0 :(得分:0)

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)的运行时类型,它是 allways System.Type。您为什么要使用dynamic隐藏此信息?