在 C# 中使用 Codedom 添加属性

Add attribute using Codedom in C#

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

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

但是不能,所以请告诉我如何实现它或提供任何解释相同的示例。

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

需要注意的一件事是,自动属性 ​​(get; set;) syntactic sugar 由 C# 编译器提供,不能由 CodeDOM 生成。要创建 属性,您需要以传统方式提供支持字段。

回答您问题的关键是 CodeAttributeDeclaration class。

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 变量中生成(包装在测试 class 中)。

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