2014-12-14 4 views
1

Имея объект SqlDataReader, я пытаюсь получить таймаут соответствующей команды. Например, я использую это, чтобы создать мой SqlDataReader:Объект команды доступа из SqlDataReader

SqlCommand myCommand = new SqlCommand(query, some_connection); 
    _reader = myCommand.ExecuteReader(); 

В перспективе времени, используя визуальный отладчик, я могу получить доступ к этому с помощью:

_reader.Command.CommandTimeout // Visual debugger 

Нет, как я могу сделать эту «собственность» в мой код (я хотел бы показать это как свойство для третьей стороны lib)?

Контекст:

я доступ к читателю из третьей библиотеки, так что на самом деле я просто иметь доступ к читателю. Мой вопрос заключается в том, чтобы понять, почему я могу получить доступ к команде в отладчике, а не как свойство? Каков механизм за сценой, некоторое расширение собственности, отражение?

+0

myCommand.CommandTimeout? –

ответ

1

Вам нужно будет использовать Reflection, чтобы разжиться Command собственности, как это установлено в internal доступа. Это то, что использует отладчик, чтобы показать вам свойства.

PropertyInfo prop = _reader.GetType().GetProperty("Command", 
    BindingFlags.NonPublic | BindingFlags.Instance); 

DbCommand cmd = (DbCommand)prop.GetValue(_reader); 
int timeout = cmd.CommandTimeout; 

P.S. Вы не должны быть модульным тестированием сторонних компонентов - это то же самое, что сказать: «Я не доверяю платформе .NET для выполнения этой работы, поэтому я проверю все, что она делает внутренне». Если вы хотите протестировать его, поместите тесты устройства в стороннее решение.

+0

Я полностью согласен, что здесь я, возможно, не доверяю .net framework :) – agstudy

0

Предлагаю предоставить фасад (обертка) для SqlCommand и SqlConnection. Затем передайте этот объект в стороннюю библиотеку.

public class MyOwnReader : IDisposable 
{ 
    bool isDisposed = false; 

    SqlConnection _connection; 
    SqlCommand _command; 


    // You can expose the whole command, or specific property of the command 
    public SqlCommand Command 
    { 
     get 
     { 
      return _command; 
     } 
    } 


    public MyOwnReader(string connectionString) 
    { 
     _connection = new SqlConnection(connectionString); 
     _connection.Open(); 
     _command = new SqlCommand(); 
     _command.Connection = _connection; 
     _command.CommandType = CommandType.StoredProcedure; //example initialization 
    } 

    public void Dispose() 
    { 
     if (!isDisposed) 
     { 
      _connection.Dispose(); 
      _command.Dispose(); 

      isDisposed = true; 
     } 
    } 

    public SqlDataReader ExecuteReader() 
    { 
     return _command.ExecuteReader(); 
    } 
} 
Смежные вопросы