Вернуть значение параметра out из метода, вызванного делегатом MatchEvaluator? - PullRequest
0 голосов
/ 24 октября 2019

У меня есть существующие методы, каждый из которых возвращает тип String. И теперь мне нужно вернуть дополнительное значение из метода и передать его другому. Я обнаружил, что один из способов сделать это - использовать «параметр out».

Значение (paramObject), которое я хочу вернуть, получено из метода, вызываемого делегатом MatchEvaluator.

var result = Regex.Replace(param1, pattern, new MatchEvaluator(m => MethodToMatch(m, param2, out SomeObject paramObject)));

Возможно ли это вообще? Если нет, то есть ли обходной путь или другой способ добиться этого?

Заранее спасибо за любую помощь.

public class TextCompiler
{
    public string Compile(string param1, string param2)
    {
        // some codes here ****

        var pattern = @"@\{.*?}+";

        var result = Regex.Replace(param1, pattern, new MatchEvaluator(m => MethodToMatch(m, param2, out SomeObject paramObject)));

        // OnActionCompleted(paramObject); //the variable raises an error "The name does not exist in the current context."                         

        return result;
    }


    protected string MethodToMatch(Match m, string param2, out SomeObject paramObject)
    {
        // Do something here ****

        var myClass = new MyClass();
        var cmd = "some strings";

        string pm = myClass.Execute(cmd, param2, out SomeObject pObj);

        paramObject = pObj;

        return pm;
    }
}


public class MyClass
{
    public string Execute(string cmd, string param2, out SomeObject paramObject)
    {

        // ** Do something here..

        var pObj = new SomeObject();

        // ** Insert some values to pObj..
        pObj = "some values here";

        var str = "Example Only";

        paramObject = pObj;

        return str;
    }
}

1 Ответ

0 голосов
/ 24 октября 2019

Похоже, вы выбрали неверную архитектуру. Но вы можете сделать это как следует:

        public string Compile(string param1, string param2)
        {
            // some codes here ****

            var pattern = @"@\{.*?}+";

            var objects = new List<Class1>();
            var result = Regex.Replace(param1, pattern, m =>
            {
                var r = MethodToMatch(m, param2, out var paramObject);
                objects.Add(paramObject);
                return r;
            });

            OnActionCompleted(paramObjects);

            return result;
        }

Узнайте больше о замыканиях в .net

...