C # CodeDom "как" и "это" функциональность ключевых слов - PullRequest
0 голосов
/ 04 сентября 2018

Использование CodeDom Я ищу способ для генерации кода на C #, например:

SomeRefType typedVar = obj as SomeRefType;

или это:

Boolean result = obj is SomeRefType;

Но пока все, что я нашел, это CodeCastExpression класс, который может генерировать явное приведение типов. Но это не то, что мне нужно. Есть ли способ реализовать функциональность ключевых слов "как" и "есть" с использованием CodeDom?

1 Ответ

0 голосов
/ 04 сентября 2018

Для истории. По-видимому, не существует универсального способа реализации этих операторов с моделью CodeDom.

Возможно использовать CodeSnippetExpression для генерации необходимого кода. Но решение становится зависимым от используемого целевого языка.

statements.Add(new CodeVariableDeclarationStatement("SomeRefType", "typedVar", new CodeSnippetExpression("obj as SomeRefType")));
statements.Add(new CodeVariableDeclarationStatement("Boolean", "result", new CodeSnippetExpression("obj is SomeRefType")));

Другим вариантом является замена этих операторов на эффективно подобную логику. Поэтому для оператора is код выглядит примерно так:

statements.Add(new CodeVariableDeclarationStatement("Boolean", "result", new CodeMethodInvokeExpression(new CodeTypeOfExpression("SomeRefType"), "IsInstanceOfType", new CodeVariableReferenceExpression("obj"))));
// Boolean result = typeof(SomeRefType).IsInstanceOfType(obj);

и для as оператор:

statements.Add(new CodeVariableDeclarationStatement("SomeRefType", "typedVal"));
statements.Add(new CodeConditionStatement(
    new CodeMethodInvokeExpression(new CodeTypeOfExpression("SomeRefType"), "IsInstanceOfType", new CodeVariableReferenceExpression("obj")),
    new CodeStatement[] { 
        new CodeAssignStatement(new CodeVariableReferenceExpression("typedVal"), new CodeCastExpression("SomeRefType", new CodeVariableReferenceExpression("obj")))
    },
    new CodeStatement[] {
        new CodeAssignStatement(new CodeVariableReferenceExpression("typedVal"), new CodePrimitiveExpression(null))
    }));
// SomeRefType typedVal = typeof(SomeRefType).IsInstanceOfType(obj) ? (SomeRefType)obj : null;

Сгенерированный IL-код отличается от кода, который генерируется при использовании операторов is и as. Но в этом случае целевой язык может быть любым.

...