3

CodeDom / CSharpCodeProviderを使用してC#コードを生成する場合、可能な場合、出力でCLRタイプの代わりにC#エイリアスを使用するように強制することはできますか?

現在、結果のC#コードを解析し、CLRタイプをそれらのエイリアスに置き換えていますが、コード生成中にこれを実行できるかどうかを確認したいと思います。

4

1 に答える 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」などに変換)

于 2012-09-05T05:32:59.557 に答える