Приведенный ниже код создаст исковое объявленное свойство.
Следует отметить, что автоматические свойства (get; set;
) - это syntactic sugar, предоставляемые компилятором 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;
}
}
}
Если проблема только получает атрибут применяется, где остальная часть кода для нас, чтобы сделать редактирование в? –