2011-09-21 1 views
1

Я пишу асинхронный модульный тест, и я хотел бы связать его вместе с помощью lambdas (или анонимных методов?), Поэтому мне не нужно определять именованные функции для продолжений.Как написать следующие обратные вызовы в синтаксисе C# ambda?

Я прочитал несколько постов на лямбды, но most из these сделки с для каждого конструктов стиль, который я не заинтересован в

Я хотел бы сделать что-то вроде следующего (взято из here).

using Microsoft.Silverlight.Testing; 
using Microsoft.VisualStudio.TestTools.UnitTesting; 
{ 
    [TestClass] 
    public class Test2 : SilverlightTest 
    { 
     [TestMethod] 
     [Asynchronous] 
     public void TestAsync1() 
     { 
      var eventRaised = false; 
      var result = false; 
      var timer = new System.Windows.Threading.DispatcherTimer(); 

      timer.Interval = TimeSpan.FromSeconds(2); 
      timer.Tick += (object sender, EventArgs e) => 
       { 
        timer.Stop(); 

        // Simulate an expected result 
        result = true; 

        // Mark the event has being raised 
        eventRaised = true; 
       }; 

      // Start timer 
      EnqueueCallback(() => timer.Start()); 

      // Wait until event is raised 
      EnqueueConditional(() => eventRaised); 
      EnqueueCallback(() => 
      { 
       // Additional tasks can be added here 
       Assert.IsTrue(result); 
      }); 

      EnqueueTestComplete(); 
     } 
    } 
} 

Но я думаю, мне не нужен материал EnqueueCallback().

Ниже мой код без лямбды:

[TestClass] 
public class IdentityEditDatabaseTest : WorkItemTest 
{ 
    [TestMethod, Asynchronous] public void testNullInsert() 
    { 
    wipeTestData(testNullInsertContinue1); 
    } 
    private void testNullInsertContinue1(String errorString) 
    { 
    IdentityProperties properties = new IdentityProperties(getContext()); 
    properties.setUserName(DATABASE_TEST); 
    postUserEdit(properties, testNullInsertContinue2); 
    } 
    private void testNullInsertContinue2(String errorString) 
    { 
    Assert.assertTrue(errorString == null); 

    wipeTestData(testNullInsertContinue3); 
    } 
    private void testNullInsertContinue3(String errorString) 
    { 
    TestComplete(); 
    } 
} 

... 

Опять же, вопрос:

Как я строка вышеприведенные вместе, используя лямбды (? Или анонимные методы), так что я не должны определить именованные функции для продолжений?

Пожалуйста, объясните новый синтаксис как можно больше, поскольку я все еще пытаюсь обернуть голову вокруг концепции.

Большое спасибо!

+0

Я могу быть совершенно глупым и, может быть, я не понял вопроса (это выглядит тяжело), ​​но почему бы вам не подписаться на таймер. –

ответ

1

Если мы имеем следующий метод:

private void DoSomething(object argument) 
{ 
    // Do something with the argument here 
} 

вы, вероятно, знаете, что он может быть назначен переменной делегата, как это:

Action<object> asDelegate = DoSomething; 

сделать это же задание, используя анонимный метод, мы можем использовать лямбда-выражение:

Action<object> asDelegate = (object argument) => 
    { 
     // Do something with the argument here 
    } 

Итак, в вашем примере метод tes tNullInsert может быть записана следующим образом:

[TestMethod, Asynchronous] 
public void testNullInsert() 
{ 
    wipeTestData((string errorString) => 
    { 
     IdentityProperties properties = new IdentityProperties(getContext()); 
     properties.setUserName(DATABASE_TEST); 
     postUserEdit(properties, testNullInsertContinue2); 
    }); 
} 

Все, что я сделал там заменить имя testNullInsertContinue1 с лямбда-выражения, содержащего такую ​​же функциональность. Вы можете сделать то же самое с testNullInsertContinue2, если хотите.

После того, как вы познакомитесь с использованием лямбда-выражений, вы можете отказаться от таких вещей, как скобки вокруг аргумента (если есть только один аргумент), а типы аргументов, которые компилятор может их часто вывести, но я написал это так, чтобы попытаться дать вам как хорошее представление о том, что происходит, насколько это возможно. Надеюсь это поможет.

+0

Спасибо, что отвечает на мой вопрос отлично. К сожалению, я не смогу использовать этот подход, потому что это означает, что мне нужно будет переименовать переменную «errorString» каждый раз, когда я соединяю лямбда, чтобы избежать CS0136 :( – swinefeaster

Смежные вопросы