2016-11-11 67 views
-1

我想在c#中使用Codedom創建頁面時添加以下代碼行。在C#中使用Codedom添加屬​​性

[Range(typeof(decimal), "-922337203685477.5808", "922337203685477.5807", ErrorMessage = "")] 
public string d3 { get; set; } 

但不能所以請讓我知道我可以achived,或提供解釋相同的樣本。

+1

如果問題是剛開應用屬性,這裏是代碼爲我們做編輯的休息嗎? –

回答

3

下面的代碼將創建您提供的屬性定義。

有一點要注意的是,自動屬性(get; set;)是由C#編譯器提供的syntactic sugar,不能由CodeDOM生成。要創建一個屬性,您需要以傳統方式提供支持字段。

回答你的問題的關鍵是CodeAttributeDeclaration類。

const string fieldName = "_d3"; 

// Create the backing field for the property. 
var field = new CodeMemberField(typeof(string), fieldName); 

// Create the property. 
var prop = new CodeMemberProperty(); 
prop.Attributes = MemberAttributes.Public | MemberAttributes.Final; // Public, non-virtual. 
prop.Name = "d3"; 
prop.Type = new CodeTypeReference(typeof(string)); 
prop.GetStatements.Add(new CodeMethodReturnStatement(new CodeVariableReferenceExpression(fieldName))); 
prop.SetStatements.Add(new CodeAssignStatement(new CodeVariableReferenceExpression(fieldName), new CodeVariableReferenceExpression("value"))); 

// Create the attribute declaration for the property. 
var attr = new CodeAttributeDeclaration(new CodeTypeReference(typeof(System.ComponentModel.DataAnnotations.RangeAttribute))); 
attr.Arguments.Add(new CodeAttributeArgument(new CodeTypeOfExpression(typeof(decimal)))); 
attr.Arguments.Add(new CodeAttributeArgument(new CodePrimitiveExpression("-922337203685477.5808"))); 
attr.Arguments.Add(new CodeAttributeArgument(new CodePrimitiveExpression("922337203685477.5807"))); 
attr.Arguments.Add(new CodeAttributeArgument("ErrorMessage", new CodePrimitiveExpression(""))); 
prop.CustomAttributes.Add(attr); 

// Create a class to contain the property. 
var testClass = new CodeTypeDeclaration("TestClass"); 
testClass.Members.Add(field); // Add the backing field. 
testClass.Members.Add(prop); // Add the property. 

執行該代碼將導致您的屬性在code變量(包裝在一個測試類)的產生。

string code; 
using (var provider = CodeDomProvider.CreateProvider("CSharp")) 
using (var stream = new MemoryStream()) 
using (var writer = new StreamWriter(stream)) 
using (var reader = new StreamReader(stream)) 
{ 
    provider.GenerateCodeFromType(testClass, writer, new CodeGeneratorOptions() { BracingStyle = "C" }); 
    writer.Flush(); 
    stream.Position = 0; 
    code = reader.ReadToEnd(); 
} 

內容的code變量:

public class TestClass 
{ 

    private string _d3; 

    [System.ComponentModel.DataAnnotations.RangeAttribute(typeof(decimal), "-922337203685477.5808", "922337203685477.5807", ErrorMessage="")] 
    public string d3 
    { 
     get 
     { 
      return _d3; 
     } 
     set 
     { 
      _d3 = value; 
     } 
    } 
}