在c#中使用Codedom添加属性
本文关键字:Codedom 添加 属性 | 更新日期: 2023-09-27 18:17:19
我想在c#中使用Codedom创建页面时添加以下代码行。
[Range(typeof(decimal), "-922337203685477.5808", "922337203685477.5807", ErrorMessage = "")]
public string d3 { get; set; }
但是不能,所以请让我知道我如何才能实现它或提供任何解释相同的样本。
下面的代码将创建您提供的属性定义。
需要注意的一点是,自动属性(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;
}
}
}