2013-07-28 3 views
3

Я не уверен, что это возможно. Я пытаюсь немного узнать о лямбда-выражениях из-за программы, которую я пишу с моим приятелем. Поэтому у него есть класс базы данных, который говорит с сервером MS SQL. Я хотел провести некоторое тестирование на классах, и поэтому сделал простую компактную базу данных, которая в моем TextFixtureSetup я заполняю таблицы (2 таблицы прямо сейчас), а затем в режиме разрыва я удаляю все данные. его класс базы данных использует что-то вроде этого для его SQL соединенияПолиморфный класс с использованием лямбда

protected void WithConnection(Action<SqlConnection> sqlBlock) 
    { 
     try 
     { 
      using (SqlConnection connection = new SqlConnection(this.ConnectionString)) 
      { 
       connection.Open(); 
       sqlBlock(connection); 
      } 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(@"Exception during database connection: {0}", ex); 
     } 
    } 

Я думаю, что я нашел пост, что Джон Скит ответил, используя почти тот же код. https://stackoverflow.com/a/1063112/1329396

Я думаю, что это классно, но моя база данных использует SQLCEReader. Я сделал небольшое исследование и обнаружил, что у них общий класс System.Data.Common.DbDataReader, и он находится только на одном уровне. Я не очень много разбираюсь в этом, но я думал о том, можно ли использовать стиль полиморфного стиля для использования стиля программирования WithConnection, который позволил бы мне использовать мой SQLCeDataReader и его SQLDataReader. Есть ли способ сделать это

+0

Я не понимаю, чего вы пытаетесь достичь. –

ответ

5

Используйте заводскую функцию. Если вы можете получить только с помощью DbConnection для всех ваших Actions вам не нужны дженерики:

protected void WithConnection(Action<DbConnection> sqlBlock, Func<DbConnection> dbCxnFactory) 
{ 
    try 
    { 
     using (DbConnection connection = dbCxnFactory()) 
     { 
      connection.ConnectionString = this.ConnectionString; 
      connection.Open(); 
      sqlBlock(connection); 
     } 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(@"Exception during database connection: {0}", ex); 
    } 
} 

Если вы хотите специализироваться, некоторые действия в только SqlConnection и некоторые SqlCeConnection только, то вы можете сделать это общий:

protected void WithConnection<T>(Action<T> sqlBlock, Func<T> dbCxnFactory) where T : DbConnection 
{ 
    try 
    { 
     using (T connection = dbCxnFactory()) 
     { 
      connection.ConnectionString = this.ConnectionString; 
      connection.Open(); 
      sqlBlock(connection); 
     } 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(@"Exception during database connection: {0}", ex); 
    } 
} 

Если вы не хотите, чтобы пройти на заводе в качестве параметра, вы можете использовать общий с new()

protected void WithConnection<TCxn>(Action<TCxn> sqlBlock) where TCxn : DbConnection, new() 
{ 
    try 
    { 
     using (var cxn = new TCxn()) 
     { 
      cxn.ConnectionString = this.ConnectionString; 
      cxn.Open(); 
      sqlBlock(cxn); 
     } 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(@"Exception during database connection: {0}", ex); 
    } 
} 
Смежные вопросы