2016-01-28 3 views
0

Это мой код:Получить асинхронный результат метода обратного вызова 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); 
} 

Как вы знаете, IAsyncResult имеет несколько полезный метод. Я не могу получить детали результата выполнения. Когда я отлаживаю этот код, я нашел следующие вещи: enter image description here Как я могу получить доступ к членам, не являющимся членами Сообщества?

ответ

0

Вы можете использовать отражение в C# для доступа к общедоступным методам. Попробуйте следующий фрагмент:

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

В основном мы размышляем о типе нам нужны (тип IAsyncResult через ага), а затем указать поле/свойство мы заинтересованы в («ErrorCode»), а затем получить его значение для конкретного экземпляра (ar).

Как и в GetProperty, существуют различные вспомогательные методы для получения значений для полей, членов и т. Д., Которые принимают различные фильтры, чтобы получить нужное вам значение.

+0

Спасибо, но это не сработает. Я получил «Необработанное исключение типа« Исключение System.NullReferenceException »в исключении ...». И я не могу найти MultipleAddressConnectAsyncResult в любом месте. – guogangj

+0

thats, потому что это частный класс в пространстве имен System.Nets .NET. поэтому мы можем получить тип во время выполнения. я изменил ответ. сообщите мне, если это сработает. –

+0

Хорошо, это работает. – guogangj