Могу ли я передать параметр имени метода методу, который может использоваться классом или структурой? - PullRequest
0 голосов
/ 12 декабря 2018

В настоящее время у меня есть этот метод:

 public void CreateDefaultTextPart(Func<string> methodName)
 {
    CreateTextPart("DefaultText.txt", (string text)  =>
    {
        Regex regex = new Regex(string.Join("|", replacements.DefaultText().Keys.Select(x => Regex.Escape(x))));
        string replaced = regex.Replace(text, m => replacements.DefaultText()[m.Value]);
        return replaced;
    }
    );
 }

, где replacements является структурой.

У меня есть несколько этих методов, которые довольно похожи, единственное отличие состоит в том, что часть кода, в которой структура replacement вызывает свои методы.Поэтому вместо того, чтобы повторять метод CreateTextPart для каждого метода, который находится в структуре, я хотел бы просто вызвать универсальное имя метода следующим образом:

replacements.methodName()

Где methodname() может быть любым допустимым методомчто я передаю, что существует в структуре.Поэтому я могу передать параметр methodname непосредственно в CreateTextPart, вместо того, чтобы несколько методов делали одно и то же.

В настоящее время я вызываю такие методы:

  public void CreateTextFile()
  {
    CreateDefaultTextPart(SomeTestMethod); //"SomeTestMethod" is not used by any means here.
    CreateRedTextPart();
    CreateEndTextPart();
  }

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

 public void CreateTextFile()
  {
    CreateDefaultTextPart(DefaultText);
    CreateDefaultTextPart(RedText);
    CreateDefaultTextPart(EndText);
  }

Полученный метод должентогда выглядите так:

public void CreateDefaultTextPart(Func<string> methodName)
 {
    CreateTextPart("DefaultText.txt", (string text)  =>
    {
        Regex regex = new Regex(string.Join("|", replacements.methodName().Keys.Select(x => Regex.Escape(x))));
        string replaced = regex.Replace(text, m => replacements.methodName()[m.Value]);
        return replaced;
    }
    );
 }

Конечно, с более подходящим названием.

Я знаю, что не могу использовать Func здесь, как я делаю, но возможно ли достичь этого каким-то другим способом?Спасибо!

1 Ответ

0 голосов
/ 13 декабря 2018

Предполагая, что существует один глобальный replacements struct (??), и предполагая, что не определены типы, вы можете передать лямбду, чтобы указать метод-член для вызова.

public void CreatePart(Func<ReplacementMap, Dictionary<string, string>> getReplacementMap) {
    CreateTextPart("DefaultText.txt",
        (string text) => {
            var mapd = getReplacementMap(replacements);
            Regex regex = new Regex(string.Join("|", mapd.Keys.Select(x => Regex.Escape(x))));
            string replaced = regex.Replace(text, m => mapd[m.Value]);
            return replaced;
        }
    );
}

Тогда вы простовызов CreatePart для каждой части:

public void CreateTextFile() {
    CreatePart(r => r.DefaultText());
    CreatePart(r => r.RedText());
    CreatePart(r => r.EndText());
}

Но зачем все это делать, если вы можете просто передать результат вызова метода напрямую?

public void CreatePart(Dictionary<string, string> mapd) {
    CreateTextPart("DefaultText.txt",
        (string text) => {
            Regex regex = new Regex(string.Join("|", mapd.Keys.Select(x => Regex.Escape(x))));
            string replaced = regex.Replace(text, m => mapd[m.Value]);
            return replaced;
        }
    );
}

public void CreateTextFile() {
    CreatePart(replacements.DefaultText());
    CreatePart(replacements.RedText());
    CreatePart(replacements.EndText());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...