Как я могу написать следующие продолжения обратного вызова в синтаксисе C # лямбда? - PullRequest
1 голос
/ 21 сентября 2011

Я пишу асинхронный модульный тест, и я хотел бы связать его вместе, используя лямбды (или анонимные методы?), Чтобы мне не приходилось определять именованные функции для продолжений.

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

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

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();
  }
}

...

Опять вопрос:

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

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

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

1 Ответ

1 голос
/ 21 сентября 2011

Если у нас есть следующий метод:

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
    }

Итак, в вашем примере метод testNullInsert можно написать так:

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...