CodeDom / CSharpCodeProviderを使用してC#コードを生成する場合、可能な場合、出力でCLRタイプの代わりにC#エイリアスを使用するように強制することはできますか?
現在、結果のC#コードを解析し、CLRタイプをそれらのエイリアスに置き換えていますが、コード生成中にこれを実行できるかどうかを確認したいと思います。
CodeDom / CSharpCodeProviderを使用してC#コードを生成する場合、可能な場合、出力でCLRタイプの代わりにC#エイリアスを使用するように強制することはできますか?
現在、結果のC#コードを解析し、CLRタイプをそれらのエイリアスに置き換えていますが、コード生成中にこれを実行できるかどうかを確認したいと思います。
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」などに変換)