在C#中使用Codedom添加属​​性

问题描述:

我想在c#中使用Codedom创建页面时添加以下代码行。在C#中使用Codedom添加属​​性

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

但不能所以请让我知道我可以achived,或提供解释相同的样本。

+1

如果问题是刚开应用属性,这里是代码为我们做编辑的休息吗? –

下面的代码将创建您提供的属性定义。

有一点要注意的是,自动属性(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; 
     } 
    } 
}