Вызов метода из внешнего класса с использованием CodeDom - PullRequest
2 голосов
/ 12 июля 2011

У меня есть два метода;один из которых находится вне класса, другой внутри класса.Я хотел бы иметь возможность использовать CodeDom для вызова из метода вне класса, внутри метода класса.Это будет намного легче объяснить с помощью кода ...

Класс с методом внутри:

public static class Public
{
    public static byte[] ReadAllData(string sFilePath)
    {
        byte[] b = new byte[sFilePath.Length];
        b = System.IO.File.ReadAllBytes(sFilePath);
        return b;
    }  
}

** из другого класса:

Public.ReadAllData(@"C:\File.exe");

Я хочу восстановить вышеупомянутое, используя CodeDom -

CodeMemberMethod method = new CodeMemberMethod();

method.Statements.Add(new CodePropertyReferenceExpression(
new CodeVariableExpression("Public"), "ReadAllData"));

Приведенный выше код выдаст следующий вывод - но обратите внимание, я не смогпередать любые параметры!

Public.ReadAllData;

Ответы [ 2 ]

7 голосов
/ 12 июля 2011
var compiler = new CSharpCodeProvider();

var invocation = new CodeMethodInvokeExpression(
    new CodeTypeReferenceExpression(typeof(Public)),
    "ReadAllData", new CodePrimitiveExpression(@"C:\File.exe"));

var stringWriter = new StringWriter();
compiler.GenerateCodeFromExpression(invocation, stringWriter, null);
Console.WriteLine(stringWriter.ToString());

Этот код дает результат

ConsoleApplication1.Public.ReadAllData("C:\\File.exe")

Другой вариант -

var invocation = new CodeMethodInvokeExpression(
    new CodeMethodReferenceExpression(
        new CodeTypeReferenceExpression(typeof(Public)),"ReadAllData"),
    new CodePrimitiveExpression(@"C:\File.exe"));

Использование CodeMethodReferenceExpression таким способом может быть полезно при вызове универсальных методов: вы можете указать параметры типа в его конструкторе.

0 голосов
/ 12 июля 2011

Я только немного использовал CodeDom, но я думаю, что вы захотите CodeMethodInvokeExpression вместо CodePropertyReferenceExpression. Похоже, CodePropertyReferenceExpression генерирует инструкцию, которая обращается к значению свойства, а не вызывает метод.

В CodeMethodInvokeExpression имеется свойство Parameters, которое позволит вам указать параметры, передаваемые методу, который вы хотите вызвать.

...