在c#中使用Codedom添加属性

本文关键字:Codedom 添加 属性 | 更新日期: 2023-09-27 18:17:19

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

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

但是不能,所以请让我知道我如何才能实现它或提供任何解释相同的样本。

在c#中使用Codedom添加属性

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

需要注意的一点是,自动属性(get; set;)是c#编译器提供的语法糖,不能由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;
        }
    }
}