我创建了一个名为DataContracts
的可移植类库,其中包含我的项目Messages
和Views
。其中包含GetStockItemByIDRequest
和StockView
等标准内容。
当我尝试使用DataAnnotations
为System.ComponentModel.DataAnnotations
部分Views
添加[DataContract]
public class StockView
{
[Required]
[DataMember]
public Guid StockID { get; set; }
[Required]
[DataMember]
public string Name { get; set; }
}
时,问题就在于此。
System.ComponentModel.DataAnnotations
我可以成功将StockView View = new StockView();
添加到我的可移植类库项目中,并且可以在我的Windows Phone 8应用程序中成功引用它,甚至可以在我的Windows中创建我的视图的新实例Newtonsoft.Json
电话应用程序但是如果我尝试使用System.Net.Http.HttpClient
或HttpClient client = new HttpClient();
HttpResponseMessage response = await client.GetAsync("http://myservice.com");
T result = await response.Content.ReadAsAsync<T>();
来执行类似
T result = await Newtonsoft.Json.JsonConvert.DeserializeObjectAsync<T>("{}");
OR
Could not load file or assembly 'System.ComponentModel.DataAnnotations, Version=2.0.5.0'
即:涉及反序列化的地方......
我遇到错误System.ComponentModel.DataAnnotations
。我假设是因为它看起来不是{{1}} is supported in Windows Phone 8(但为什么我可以将它添加为我的PCL的参考?)。
所以我的问题是,为什么在我直接创建这些类的新实例时不会调用此错误,其次如何解决此问题?
答案 0 :(得分:5)
遗憾的是,DataAnnotations目前不具备可移植性。虽然有点复杂,但您可以通过在PCL中编写自己的DataAnnotation属性来解决这个问题,并为.NET Framework项目创建一个具有相同名称的程序集,该类型将属性转换为&#34; real&#34;版本。有关详细信息,请参阅this answer。
答案 1 :(得分:5)
好的,事实证明我原来的假设是完全错误的。您绝对可以从Windows Phone 8项目中引用System.ComponentModel.DataAnnotations
命名空间。
基本上它归结为反直观地引用可以位于C:\Program Files (x86)\Microsoft SDKs\Silverlight\v4.0\Libraries\Client\System.ComponentModel.DataAnnotations.dll
有关如何构建可移植类库的更多信息,我建议referring to this article。
答案 2 :(得分:1)
某些PCL配置文件支持数据注释。
支持的配置文件:
最值得注意的是,不支持最新的Windows Phone(当时为8.1)。
请参阅以下内容中的完整PCL功能表: http://msdn.microsoft.com/en-us/library/gg597391%28v=vs.110%29.aspx
答案 3 :(得分:0)
1)创建新类实例的过程不涉及通过反射加载的读取自定义属性。
2)System.ComponentModel.DataAnnotations是ASP.NET独有的
System.ComponentModel.DataAnnotations命名空间提供了属性 用于为ASP.NET MVC和ASP.NET定义元数据的类 数据控制。
答案 4 :(得分:0)
System.ComponentModel.DataAnnotations的可移植版本似乎不完整(例如没有MaxLengthAttribute)。
有这个图书馆:
https://github.com/ryanhorath/PortableDataAnnotations:
Install-Package Portable.DataAnnotations
您的PCL需要定位Silverlight 8,否则会出现多个类定义错误。