使用CodeDom / CSharpCodeProvider输出C#别名(int等)而不是CLR类型(Int32等)

3
使用CodeDom / CSharpCodeProvider生成C#代码时,是否可以强制输出在可能的情况下使用C#别名而不是CLR类型?
我目前正在解析生成的C#代码并将CLR类型替换为它们的别名,但我想知道是否可以在代码生成期间执行此操作。

1
你目前在代码 DOM 中如何指定类型? - Kirk Woll
1
CodeDom提供的选项无法修改其输出的文本。除非您编写自己的提供程序或对文本进行后处理。 - Hans Passant
你的目标是什么?你为什么要执行这个操作?CodeDomProvider用于生成程序集,在两种情况下结果都相同。 - abatishchev
在使用CLR类型声明枚举的基本类型时会出现问题。例如,生成的代码是“enum : UInt32”,而不是“enum : uint”。 - Marc Newlin
1个回答

0

Microsoft.CSharp.CSharpCodeProvider默认生成带有C#别名的代码。

例如:

        CodeCompileUnit compileUnit = new CodeCompileUnit();
        CodeNamespace sampleNamespace = new CodeNamespace("Sample");

        CodeTypeDeclaration sampleClass = new CodeTypeDeclaration("SampleClass");
        sampleClass.IsClass = true;
        sampleClass.Members.Add(new CodeMemberField(typeof(Int32), "_sampleField"));

        CodeMemberProperty prop = new CodeMemberProperty();
        prop.Attributes = MemberAttributes.Public | MemberAttributes.Final;
        prop.Name = "SampleProp";
        prop.HasGet = true;
        prop.Type = new CodeTypeReference(typeof(System.Int32));
        prop.GetStatements.Add(new CodeMethodReturnStatement(
    new CodeFieldReferenceExpression(
    new CodeThisReferenceExpression(), "_sampleField")));

        sampleClass.Members.Add(prop);
        sampleNamespace.Types.Add(sampleClass);
        compileUnit.Namespaces.Add(sampleNamespace);

        using (var fileStream = new StreamWriter(File.Create("outputfile.cs")))
        {
            var provider = new Microsoft.CSharp.CSharpCodeProvider();

            provider.GenerateCodeFromCompileUnit(compileUnit, fileStream, null);
        }

将生成:

namespace Sample {

    public class SampleClass {

        private int _sampleField;

        public int SampleProp {
            get {
                return this._sampleField;
            }
        }
    }
}

正如你所看到的,尽管我使用 typeof(Int32),它会将其转换为“int”。(Int64 转换为“long”等)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接