C# WCF - 在客户端应用程序中使用服务中的实体
C# WCF - Using entity from Service in client app
我是 WCF 新手,遇到的问题很简单。在我的服务库中,我有 class :
[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;
}
服务 class 看起来像这样:
[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());
}
但是对于列表中的每个玩家,我只得到:
有人可以帮我吗?
谢谢
这与 WCF
无关,只是您在未覆盖它的对象上使用 ToString
,这意味着您将获得默认实现,它提供你这个 class 名字。
执行以下任一操作:
public class Player
{
...
public override string ToString()
{
return this.UserName; // or whatever you wish to print
}
...
}
或者:
MessageBox.Show( player.UserName );
您已经覆盖了服务端的 ToString
-方法
[DataContract]
public class Player
{
.
.
.
[OperationContract]
public override string ToString()
{
return UserName;
}
但是方法没有被序列化,因此没有传送到客户端。这意味着您收到一个仅包含其数据的播放器对象(所有字段 and/or 属性都装饰有 [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();
在客户端调用player.UserName。变量玩家 = ps.GetPlayers(); //ps 是 PiskvorkyServiceClient() 的实例; foreach (var player in Players) { MessageBox.Show( player.UserName ; }
我是 WCF 新手,遇到的问题很简单。在我的服务库中,我有 class :
[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;
}
服务 class 看起来像这样:
[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());
}
但是对于列表中的每个玩家,我只得到:
有人可以帮我吗?
谢谢
这与 WCF
无关,只是您在未覆盖它的对象上使用 ToString
,这意味着您将获得默认实现,它提供你这个 class 名字。
执行以下任一操作:
public class Player
{
...
public override string ToString()
{
return this.UserName; // or whatever you wish to print
}
...
}
或者:
MessageBox.Show( player.UserName );
您已经覆盖了服务端的 ToString
-方法
[DataContract]
public class Player
{
.
.
.
[OperationContract]
public override string ToString()
{
return UserName;
}
但是方法没有被序列化,因此没有传送到客户端。这意味着您收到一个仅包含其数据的播放器对象(所有字段 and/or 属性都装饰有 [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();
在客户端调用player.UserName。变量玩家 = ps.GetPlayers(); //ps 是 PiskvorkyServiceClient() 的实例; foreach (var player in Players) { MessageBox.Show( player.UserName ; }