如何生成空的get&在c#中使用CODEDOM设置语句

时间:2012-12-03 07:54:47

标签: c#-4.0

目前我所拥有的代码正在生成像

这样的属性
private int integerProperty  
         { 
            get  
            { 
                return integerField; 
            }
            set  
            { 
                integerField = value; 
            } 
        } 

我希望这些属性很简单......

private int integerProperty  
         { 
            get;              
            set; 
         } 

我的代码是

 CodeMemberProperty property1 = new CodeMemberProperty();
        property1.GetStatements.Add(new CodeMethodReturnStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "integerField")));
        property1.SetStatements.Add(new CodeAssignStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "integerField"),new CodePropertySetValueReferenceExpression()));
        type1.Members.Add(property1);

任何人都请帮忙。提前谢谢。

3 个答案:

答案 0 :(得分:13)

正如Botz3000所说,它正式无法实现。但是,通过以下hack,您可以实现它:

var field = new CodeMemberField
  {
      Attributes = MemberAttributes.Public | MemberAttributes.Final,
      Name = "MyProperty",
      Type = new CodeTypeReference(typeof(MyType)),
  };

  field.Name += " { get; set; }";

通过将{ get; set; }附加到字段名称,它将在实际源代码中生成一个属性。

答案 1 :(得分:0)

不,这是不可能的。自动属性是特定于语言的功能,因此您无法找到生成这些属性的任何方法。

答案 2 :(得分:0)

这是一个古老的问题,但值得注意的是" @Serguei Fedorov"不再适用(它仅适用于c#1.0到c#2.0)

替换"};"的解决方案用"}"应该避免,因为"};"用于从C#3.0开始的Object和Collection Initializers的语法。

回顾Object and Collection Initializers

示例:

 var pet = new { Age = 10, Name = "Fluffy" };  //it's ended by "};"

替代解决方案

您可以使用支持C#1.0到c#6.0的the new .NET Compiler Platform ("Roslyn")

samples 包括ConvertToAutoProperty - 一个代码重构,用于将一个简单的getter和setter更改为一个简单的属性为auto属性。

如果您对CodeDom感兴趣,可以从nuget安装新的CodeDOM Providers for .NET Compiler Platform (“Roslyn”)