2016-01-28 1 views
0

Voici mon code:obtenir le résultat async de la méthode de rappel de TCPClient.BeginConnect

TcpClient _tcpClient = new TcpClient(AddressFamily.InterNetwork); 

public void BeginConnect(string address, ushort port, OnConnectCallback cb) { 
    IAsyncResult ar = _tcpClient.BeginConnect(address, port, ConnectCallback, cb); 
} 

private void ConnectCallback(IAsyncResult ar) { 
    //The ar is acturally an instance of MultipleAddressConnectAsyncResult 
    //it contains the execution result I want. 
    //However, MultipleAddressConnectAsyncResult class is not public. 
    _tcpClient.EndConnect(ar); 
} 

Comme vous le savez, IAsyncResult a quelques méthode utile. Je ne peux pas obtenir les détails du résultat de l'exécution. Lorsque je débogue ce code, je trouve ce que je veux comme suit: enter image description here Comment puis-je accéder aux membres non-publics?

Répondre

0

Vous pouvez utiliser la réflexion en C# pour accéder à des méthodes non publiques. Essayez l'extrait suivant:

var errorCode = ar.GetType().GetProperty("ErrorCode", 
BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.NonPublic).GetValue(ar); 

Fondamentalement, nous réfléchissons sur le type dont nous avons besoin (type de IAsyncResult via ar), puis spécifiez le champ/la propriété qui nous intéresse (« ErrorCode »), puis obtenir sa valeur pour une instance particulière (ar).

Similaire à GetProperty, il existe différentes méthodes d'assistance pour obtenir des valeurs pour les champs, les membres, etc. qui prennent différents filtres pour obtenir la valeur spécifique dont vous avez besoin.

+0

Merci, mais cela ne fonctionne pas. J'ai une 'Une exception non gérée de type' System.NullReferenceException 's'est produite dans ...' exception. Et je ne peux pas trouver MultipleAddressConnectAsyncResult n'importe où. – guogangj

+0

c'est parce que c'est une classe privée dans l'espace de noms System.Nets de .NET. Nous pouvons donc obtenir le type à l'exécution. J'ai modifié la réponse. s'il vous plaît laissez-moi savoir si cela fonctionne. –

+0

D'accord, ça fonctionne. – guogangj