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

Я создаю код с помощью CodeDom.Однако CodeDom не поддерживает лямбда-операторы.Поэтому я сейчас пытаюсь имитировать лямбда-оператор, создавая локальный метод и передавая метод в качестве параметра другому методу.Примерно так:

public string MainMethod(string myParameter)
{
    string g() { return instance.MainMethod(myParameter); }
    return someOtherMethod(g);
}

Метод 'MainMethod' уже создан с использованием CodeDom, и я пытаюсь получить локальный метод там.Тем не менее, я не могу найти способ сделать это до этого момента.Я мог бы использовать некоторую помощь с этим.

Я уже пытался добавить CodeMemberMethod к CodeMemberMethod, но, кажется, нет никакого способа сделать это.Кажется, я не могу найти никаких альтернатив.

В настоящее время мой код CodeDom использует MethodInfo в качестве основы:

var method = new CodeMemberMethod();
method.Name = methodInfo.Name;
method.ReturnType = new CodeTypeReference(methodInfo.ReturnType);

//left out parameter stuff

var gMethod = new CodeMemberMethod() { Name = "g", ReturnType = new CodeTypeReference(methodInfo.ReturnType) };
gMethod.Statements.Add(new CodeMethodReturnStatement(new CodeMethodInvokeExpression(new CodeMethodReferenceExpression(new CodeVariableReferenceExpression("instance"), methodInfo.Name), parameterReferences.ToArray())));
method.Statements.Add(gMethod);

Теперь, боль в последнем утверждении.Я на самом деле пытаюсь добавить CodeMemberMethod к CodeMemberMethod, что не разрешено через свойство Statements.Есть ли способ сделать это по-другому?

1 Ответ

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

Локальные функции не были поддерживаемой языковой конструкцией до версии 7 C #. CodeDOM был разработан намного раньше и не охватывает все функции C #, даже текущей версии C #.Другими словами, к сожалению, нет способа объявить «локальный метод» и добавить его в коллекцию Statements другого метода.

Вместо этого рассмотрите возможность объявления отдельного метода private.Публичный интерфейс вашего класса останется неизменным, и, скорее всего, вы добьетесь того, чего хотите.Однако неявный доступ к параметрам «внешнего метода» будет невозможен.

Также рассмотрите возможность поиска этого ответа для дальнейших идей.

...