C#WCF - 在客户端应用程序中使用Service中的实体

时间:2015-01-03 12:05:29

标签: c# wcf

我是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());
    }

但是对于列表中的每个玩家我都会得到:

String representation of player bug

有人能帮帮我吗?

谢谢

3 个答案:

答案 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;}