我在Mac上安装了Visual Studio Community Edition 2017,正在开发Xamarin.iOS应用程序,但遇到了奇怪的问题。
{}
EmailAddress
和FullName
)来跟踪问题,因此Console.WriteLine(searchRequest.EmailAddress)
在调用客户端发布方法之前将其添加到Xamarin.iOS应用中(只是想知道此问题的来源)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] 删除。
我来说两句