gpt4 book ai didi

c# - DisplayAttribute 名称属性在 Silverlight 中不起作用

转载 作者:太空狗 更新时间:2023-10-29 21:50:50 31 4
gpt4 key购买 nike

我正在绑定(bind) DataGrid.ItemsSource属性(property)给List<PersonDetails>目的。我正在通过 支持 Silverlight 的 WCF 服务 获取数据。所以 PersonDetails类在 Web Project 中实现。如果该类位于 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 事件更改标题文本。但我想让它使用属性来工作。

最佳答案

问题 是 WCF DataContract 是一种可以跨语言和平台使用的互操作机制。

如果您查看由 DataContractSerializer(或其在 System.Runtime.Serialization.dll 中的代码,特别是 InternalWriteObjectXyz() 方法),您会看到它只是将值序列化为简单的 XML 消息。不会有任何与 .NET Framework 相关的内容,因此所有类型的属性(包括自定义属性和编译器生成的属性)都将被删除,甚至不会被客户端接收。

它可以创建一个您的数据副本并将它们从服务器发送到客户端,然后客户端将创建一个具有相同签名的新类。注意:具有相同签名的新类不仅仅是原始类的新对象

当然有一些解决方法。您可以编写您自己的序列化器(有关示例,请参见 this post on SO)或您自己的 ISerializationSurrogate

如果您可以部署/共享您的程序集到您的客户端,您就有了一个很好的解决方法:只需部署它们,DataContractSerializer 就会在您的客户端上构建正确的对象(正是与您在服务器上拥有的相同,具有其所有属性)。请记住:

  • 如果自定义属性来自运行时值(例如由于本地化),那么它们将在客户端而不是服务器上解析(因为属性将在客户端创建,它们的值不会包含在 XML 消息中)。
  • 在客户端应用程序中,您需要添加对包含您的类型的程序集的引用。
  • 当您添加服务引用时,您必须指示 VS 使用它们(否则它会创建代理),在服务引用设置对话框中选择在引用程序集中重用类型(您可以将其限制为仅要共享的程序集)。

关于c# - DisplayAttribute 名称属性在 Silverlight 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15292947/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com