Mac上的Visual Studio模型缺少字段

Moamen Naanou

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

  • 我在PCL中创建了带有其模型的HttpClient(每个API调用的请求和响应)。
  • 我正在使用PCL中的模型(初始化和分配值)来从Xamarin.iOS应用程序生成发布请求对象。
  • 我正在从Xamarin.iOS应用程序调用post方法
  • 现在,我得到的帖子请求对象在PCL中始终为空!当作为字符串阅读时{}
  • 然后,我尝试使用模型之一(包含EmailAddressFullName来跟踪问题,因此Console.WriteLine(searchRequest.EmailAddress)在调用客户端发布方法之前将其添加到Xamarin.iOS应用中(只是想知道此问题的来源)
  • 现在在PCL中,我只获得EmailAddress领域{"EmailAddress" : "[email protected]"}
  • 在我尝试添加之后,我Console.WriteLine(searchRequest.FullName)就能得到正确的对象{"EmailAddress" : "[email protected]", "FullName" : "Sample Full Name"}

来自Xamarin.iOS应用的请求:

APIClient client = new APIClient();
SearchRequest searchRequest = new SearchRequest
{
  EmailAddress = "[email protected]",
  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" : "[email protected]", "FullName" : "Sample Full Name"}

谁能解释一下这是怎么回事?

马丁·齐克蒙德

在构建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;
}

您可以在官方文档中看到有关此主题的更多详细信息

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Mac上的Visual Studio损坏

在Mac的Visual Studio上运行xUnit

“无法启动Visual Studio”错误(在Mac上)

使用Visual Studio在Mac上连接Xamarin

在Mac上的Visual Studio Code上出现缩进错误(再次)

Mac上的Visual Studio缺少“管理用户秘密”上下文菜单项

是否可以运行Xamarin.UITests for Android以在Visual Studio for MAC上在MAC上运行?

在Mac的Visual Studio上运行Scaffold-DbContext

在Mac上的Visual Studio Code中更改默认终端应用

如何在Mac上删除对Visual Studio的钥匙串访问?

Visual Studio Mac 7.3.3上的软件包在哪里?

在Mac上的Visual Studio Community 2017中使用C ++?

使用cmake在Mac上生成Visual Studio解决方案

如何在Visual Studio for Mac上开发Windows应用

Mac上的Visual Studio Code中未出现Matplotlib图像

Mac上的Visual Studio社区中的C#Interactive

是否可以在 Windows 上运行 Visual Studio for Mac 项目?

在Mac上的Visual Studio 2017中安装后更改语言?

Mac 上的 Visual Studio Code 格式不正确

Visual Studio For Mac 上未加载依赖项

如何在 Visual Studio Mac 上创建 VB .NET 项目?

新的 Visual Studio for Mac (Xamarin Studio) 与 Windows 上的 Visual Studio 有什么不同吗?

Mac OS上的软件开发(适用于Mac的Visual Studio)

使用Mac和Mac上的Visual Studio 2013进行签入时,TFS访问被拒绝错误

如何在Visual Studio中的Mac上创建和运行Visual Basic代码

Mac上Visual Studio上的独立Linux 64软件包

MAC上Visual Studio 2019上的GTK#工具箱为空

如何在Visual Studio中将Project .netcore移动到Mac上的Windows上运行

如何在Mac上的Windows上编译C#Visual Studio解决方案