2012-12-03 36 views
8

目前,我有代碼生成的屬性空獲得和設置之類的語句如何生成的CodeDOM使用在C#

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); 

任何人都請幫忙。提前致謝。

回答

11

正如Botz3000所提到的,這是正式的不可能的。然而,下面的技巧你可以實現它:

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

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

通過附加{ get; set; }字段名,它會產生實際的源代碼的屬性。

 string contents; 
     using (StreamReader reader = new StreamReader(filename)) 
     { 
      contents = reader.ReadToEnd(); 

      contents = contents.Replace("};", "}"); 
     } 

     using (StreamWriter writer = new StreamWriter(filename)) 
     { 
      writer.Write(contents); 
     } 

,因爲在C#與C++不同,我們沒有:

+0

感謝沃特,德科爾特:)你救了我的時間。 – suman

+2

嗨Wouter,代碼工作完美..但它是在最後添加分號(;)..公共類示例{ public int ID {get;組; }; public string Name {get;組; }; public string Domain {get;組; }; }請注意,在物業結束時,您可以找到一個分號。 – suman

+0

解決此問題的方法是鍵入:field。名稱+ =「{get; set;} //」導致額外分號被註釋掉的'//'。 –

0

不,這是不可能的。自動屬性是一種特定於語言的功能,因此您無法找到任何生成這些功能的方法。

+0

感謝Botz3000安裝在您的輸入... – suman

2

除了由沃特的回答,您可以通過執行以下操作在酒店的代碼結尾擺脫分號任何東西中的括號之後的分號。

+0

注意:不,這是不正確的,你應該避免這種情況,因爲「};」用於C#3.0(.NET 3.5)中的對象和集合初始值設定項。請參閱https://msdn.microsoft.com/en-us/library/bb384062.aspx。例如:** var pet = new {Age = 10,Name =「Fluffy」}; **請修改您的答案; –

0

這是一個老問題,但值得注意的是,通過「@Serguei費奧多羅夫」的回答爲不再適用(它只是爲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 "};" 

替代溶液

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

samples包括ConvertToAutoProperty - 一個代碼重構,用一個簡單的getter和setter將一個簡單的屬性改成一個auto屬性。

如果您有興趣通過CodeDom中,有一個新的CodeDOM Providers for .NET Compiler Platform (「Roslyn」)可從的NuGet