【问题标题】:Outputting C# aliases (int, etc) instead of CLR types (Int32, etc) using CodeDom / CSharpCodeProvider使用 CodeDom / CSharpCodeProvider 输出 C# 别名(int 等)而不是 CLR 类型(Int32 等)
【发布时间】:2012-08-14 07:23:55
【问题描述】:

使用 CodeDom / CSharpCodeProvider 生成 C# 代码时,是否可以在可能的情况下强制输出使用 C# aliases 而不是 CLR 类型?

我目前正在解析生成的 C# 代码并用它们的别名替换 CLR 类型,但我想知道是否可以在代码生成期间执行此操作。

【问题讨论】:

  • 你目前是如何在代码dom中指定类型的?
  • CodeDom 没有提供更改它发出的文本的选项。除非您编写自己的提供程序或对文本进行后处理。
  • 你的目标是什么?你这样做是为了什么? CodeDomProvider 用于生成程序集,在这两种情况下结果是相等的
  • 使用 CLR 类型存在问题的情况是在声明具有基类型的枚举时。例如,生成的代码是“enum : UInt32”而不是“enum : uint”。

标签: c# codedom csharpcodeprovider


【解决方案1】:

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”等)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 2019-07-27
    • 2022-01-13
    相关资源
    最近更新 更多