【问题标题】:Visual Studio On Mac Models Missing FieldsMac 上的 Visual Studio 模型缺少字段
【发布时间】:2018-06-16 14:40:38
【问题描述】:

我在 MAC 上安装了 Visual Studio Community Edition 2017,正在开发 Xamarin.iOS 应用程序,但遇到了奇怪的问题。

  • 我有 PCL,我在其中创建了 HttpClient 及其模型(每个 API 调用的请求和响应)。
  • 我正在使用 PCL 中的模型(初始化和分配值)从 Xamarin.iOS 应用程序生成发布请求对象。
  • 我正在从 Xamarin.iOS 应用调用 post 方法
  • 现在我得到了在 PCL 中发布请求对象始终为空!!当读取为字符串时,它是{}
  • 然后我正在尝试使用其中一个模型(包含EmailAddressFullName)来跟踪问题,因此在调用客户端发布方法之前在 Xamarin.iOS 应用程序中添加了Console.WriteLine(searchRequest.EmailAddress)(只是为了知道源在哪里本期)
  • 现在在 PCL 中,我只得到 EmailAddress 字段 {"EmailAddress" : "sample@domain.com"}
  • 在我尝试添加 Console.WriteLine(searchRequest.FullName) 之后,我能够获得正确的对象 {"EmailAddress" : "sample@domain.com", "FullName" : "Sample Full Name"}!!!

来自 Xamarin.iOS 应用的请求:

APIClient client = new APIClient();
SearchRequest searchRequest = new SearchRequest
{
  EmailAddress = "sample@domain.com",
  FullName = "Sample Full Name"
};
var result = await client.Search(searchRequest);

PCL 客户端模型对象:

public class SearchRequest
{
public string FullName {get; set;}
public string EmailAddress {get;set}
}

PCL HTTP 客户端:

public async Task<SearchResult> Search(SearchRequest requestObj)
{
    SearchResult res = new SearchResult();
    StringContent content = new StringContent(JsonConvert.SerializeObject(requestObj, Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }), Encoding.UTF8, "application/json"); // Content as string will be {}
    HttpResponseMessage response = await client.PostAsync($"{baseURL}ApplicationSearch", content);
    return JsonConvert.DeserializeObject<SearchResult>(responseString);
}

如果我在 Xmarin.iOS 应用程序中在 var result = await client.Search(searchRequest); 之后添加以下两行:

Console.WriteLine(searchRequest.EmailAddress);
Console.WriteLine(searchRequest.FullName);

现在StringContent 对象将具有:

{"EmailAddress" : "sample@domain.com", "FullName" : "Sample Full Name"}

谁能解释一下这里发生了什么?

【问题讨论】:

    标签: c# visual-studio xamarin xamarin.ios visual-studio-2017


    【解决方案1】:

    在构建 Xamarin.iOS 应用时,它会通过托管代码的链接器运行,该链接器会去除未使用的代码,这些代码永远不会被访问以减小应用程序的大小。在您的情况下,这些属性从未被直接访问,只能通过 Json.Net 中的反射来访问。

    但是当您至少访问一次属性时,它们会包含在生成的二进制文件中,因此Json.Net 可以找到它们。

    为确保您的自定义类成员即使不直接访问也能保留,您可以向您的类添加Preserve 属性:

    [Preserve(AllMembers=true)]
    public class SearchRequest
    {
       ...
    }
    

    您可能还需要在 PCL 中使用此属性。幸运的是,您可以自己手动定义它,因为链接器只是按名称查找属性:

    public sealed class PreserveAttribute : System.Attribute {
        public bool AllMembers;
        public bool Conditional;
    }
    

    您可以在official documentation 中查看有关此主题的更多详细信息。

    【讨论】:

      猜你喜欢
      • 2020-06-05
      • 2014-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多