我是WCF的新手并且有一个简单的问题。在我的服务库中,我有课程:
[DataContract]
public class Player
{
[DataMember]
public string UserName { get; set; }
[DataMember]
public int WinNum { get; set; }
[DataMember]
public int LoseNum { get; set; }
[DataMember]
public int PlayedTime { get; set; }
.
.
.
[OperationContract]
public override string ToString()
{
return UserName;
}
服务类看起来像这样:
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
public class PiskvorkyService :IPiskvorkyService
{
[DataMember]
public List<Player> Players { set; get; }
public PiskvorkyService()
{
Players = new List<Player>();
}
.
.
.
public List<Player> GetPlayers()
{
return Players;
}
从客户端应用程序(WPF)我可以在服务器上添加一些新的播放器列表,它运行良好。但现在我需要在客户端应用程序中从服务获取播放器列表,并将它们列在我需要的任何地方。我在客户端应用程序中尝试过类似的内容:
var Players = ps.GetPlayers(); //ps is instance of PiskvorkyServiceClient();
foreach (var player in Players)
{
MessageBox.Show(player.ToString());
}
但是对于列表中的每个玩家我都会得到:
有人能帮帮我吗?
谢谢
答案 0 :(得分:1)
这与WCF
无关,只是你在一个没有覆盖它的对象上使用ToString
,这意味着你将得到默认的实现,它给你班级名称。
要么:
public class Player
{
...
public override string ToString()
{
return this.UserName; // or whatever you wish to print
}
...
}
或者:
MessageBox.Show( player.UserName );
答案 1 :(得分:1)
您已覆盖服务端的ToString
- 方法
[DataContract]
public class Player
{
.
.
.
[OperationContract]
public override string ToString()
{
return UserName;
}
但是方法没有被序列化,因此没有转移到客户端。这意味着您只会收到一个只包含其数据的玩家对象(所有字段和/或属性都用[DataMember]
修饰)。
这是默认行为。
因此,正如@Chris已经提到的那样,您最好的选择是在客户端呼叫player.UserName
。
您可以遵循的其他方法是通过客户端的扩展方法扩展您的模型。所以你可以做以下的事情:
public static class PlayerExtensions
{
public static string Print(this Player player)
{
return player.Username;
}
}
然后你可以在客户端使用这样的播放器对象:
var player = new Player { UserName = "Nick" };
string plyerName = player.Print();
答案 2 :(得分:0)
在客户端调用player.UserName。 var Players = ps.GetPlayers(); // ps是PiskvorkyServiceClient()的实例; foreach(播放器中的var播放器){MessageBox.Show(player.UserName;}