C# DisplayAttribute name属性在Silverlight中不工作
我正在将C# DisplayAttribute name属性在Silverlight中不工作,c#,asp.net,wcf,silverlight,C#,Asp.net,Wcf,Silverlight,我正在将DataGrid.ItemsSource属性绑定到列表对象。我通过启用Silverlight的WCF服务获取数据。因此,PersonDetails类在Web项目中实现。如果类位于Silverlight项目中,则每个DataGrid的标题文本都会根据我的需要进行更改。但是我不能在web服务中使用这个类。唯一的解决方案是向两个项目中添加相同的类。但是,还有别的办法吗 这个班看起来是这样的: [DataContract] public class PersonGeneralDetails {
DataGrid.ItemsSource
属性绑定到列表
对象。我通过启用Silverlight的WCF服务获取数据。因此,PersonDetails
类在Web项目中实现。如果类位于Silverlight项目中,则每个DataGrid的标题文本都会根据我的需要进行更改。但是我不能在web服务中使用这个类。唯一的解决方案是向两个项目中添加相同的类。但是,还有别的办法吗
这个班看起来是这样的:
[DataContract]
public class PersonGeneralDetails
{
// Properties
[DataMember]
[DisplayAttribute(Name = "Sira")]
public int RowNumber { get; set; }
[DataMember]
[DisplayAttribute(Name = "Seriyasi")]
public string SerialNumber { get; set; }
}
在web项目中似乎没有生成属性。我知道我可以使用DataGrid事件更改标题文本。但我想使用属性使其工作。问题在于WCFDataContract
是一种可跨语言和平台使用的互操作机制
如果查看由DataContractSerializer
生成的序列化数据(或其在System.Runtime.Serialization.dll
中的代码,特别是InternalWriteObjectXyz()
方法),您会发现它只是将值序列化为简单的XML消息。没有与.NET Framework相关的内容,因此所有类型的属性,包括自定义属性和编译器生成的属性,都将被剥离,客户端甚至不会接收到
它可以创建数据的副本并将它们从服务器发送到客户端,然后客户端将创建具有相同签名的新类。注意:具有相同签名的新类,而不仅仅是原始类的新对象
当然,有一些解决办法。您可以编写自己的序列化程序(参见示例)或自己的iSerializationSubrogate
如果您可以将程序集部署/共享到您的客户端,那么您就有了一个很好的解决方法:只需部署它们,DataContractSerializer
将在您的客户端上构建正确的对象(与服务器上的对象及其所有属性完全相同)。请记住:
- 如果自定义属性来自运行时值(例如,因为本地化),那么它们将在客户端上解析,而不是在服务器上解析(因为属性将在客户端上创建,所以它们的值不会包含在XML消息中)
- 在客户端应用程序中,需要添加对包含类型的程序集的引用
- 添加服务引用时,您必须指示VS使用它们(否则它将创建代理),在服务引用设置对话框中,选择重用引用程序集中的类型(您可以将此限制为仅要共享的程序集)