Как вернуть тип из анонимного метода / делегата - PullRequest
0 голосов
/ 13 октября 2009

Я хочу вернуть строковое значение от анонимного метода / делегата. Как я могу добиться чего-то подобного: Обратите внимание, что это даст ошибку времени компиляции: Невозможно преобразовать анонимный метод в тип 'string', потому что это не тип делегата

            StringBuilder sb = new StringBuilder("aaa");
            sb.Replace("aaa", delegate()
            {
                return "bbb";
            });

Я также пытаюсь создать метод расширения, чтобы я мог написать такой код:

StringBuilder sb = new StringBuilder("aaa");
sb.Replace("aaa", () =>                
{
  return "bbb";
});

Какой будет подпись метода продления?

EDIT:

У нас есть большой внутренний класс, который генерирует утомительные XML-файлы. Мы хотим сделать метод более читабельным, больше всего на свете. Итак, мы хотим пойти от:

StringBuilder sb = new StringBuilder(_repository.GetGenericXml1Template());
sb.Replace("$Placeholder", GetXml1Helper());

private void string GetXml1Helper()
{
   StringBuilder sb = new StringBuilder(_repository.GetGenericXml2Template());
   sb.replace("$Var1", DB.Var1);
   ....
   return  sb.ToString();
}

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

Кому:

StringBuilder sb = new StringBuilder(_repository.GetGenericXml1Template());
sb.Replace("$Placeholder", () =>
{
   StringBuilder sb = new StringBuilder(_repository.GetGenericXml2Template());
   sb.replace("$Var1", DB.Var1);
   ....
   return  sb.ToString();
}
);

Ответы [ 7 ]

1 голос
/ 13 октября 2009

Вместо StringBuilder.Replace вы можете посмотреть на Regex.Replace. Таким образом, вы можете сделать что-то вроде:

Regex.Replace("Input string", "aaa", match => "bbb");

Очень похоже на то, что вы хотите сделать, просто из коробки.

1 голос
/ 13 октября 2009

Вы должны использовать метод расширения для достижения ожидаемого ..

, так как StringBuilder.replace по умолчанию не принимает Func <>, вам необходимо создать метод расширения, который заменяет ваше требование.

вот пример кода.

public static class ExtensionMethods
{
          public static StringBuilder  replace(this StringBuilder Sb1,string input, 
          Func<string> anonymos)
          {
               return Sb1.Replace(input, anonymos.Invoke());
          }
}

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

        StringBuilder s1 = new StringBuilder();
        s1.Append("hai");
        s1.replace("hai", () =>
        {
            return "bb";
        });

надеюсь, это поможет.

0 голосов
/ 13 октября 2009

Немного неясно, как вы собираетесь использовать это - поскольку приведенный вами пример тривиален, я должен спросить, есть ли какая-то конкретная причина, по которой это должен быть анонимный метод? Разве это не может быть просто метод обычного экземпляра?

0 голосов
/ 13 октября 2009

Вы можете сделать следующее:

StringBuilder sb = new StringBuilder();
Func<string> func = delegate()
{
    return "HELLO";
};
sb.Replace("", func());

Хотя я не вижу смысла в этом ...

0 голосов
/ 13 октября 2009

Я считаю, что вам нужно расширить существующий метод.

Пожалуйста, перейдите по этой ссылке -> http://msdn.microsoft.com/en-us/library/bb383977.aspx

0 голосов
/ 13 октября 2009

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

С вашим делегатом все в порядке - ошибка просто говорит о том, что его нельзя использовать здесь, поскольку Replace ожидает string в качестве второго аргумента.

Какой будет подпись метода продления?

Ну, как-то так:

static void Replace(this StringBuilder sb, Func<string> f);

- но зачем вам это? Какой вариант использования он выполняет?

0 голосов
/ 13 октября 2009

Это правильный синтаксис для возврата строки из анонимного метода. Ваша проблема в другом - вы пытаетесь передать анонимный метод в StringBuilder.Replace() в качестве второго аргумента, где он ожидает строку.

Почему ты так делаешь?

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