2016-11-11 10 views
-1

Я хочу добавить следующую строку кода при создании страницы с помощью Codedom в C#.Добавить атрибут с использованием Codedom в C#

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

Но не могу, поэтому, пожалуйста, дайте мне знать, как я могу его достичь или предоставить образец, который объясняет то же самое.

+1

Если проблема только получает атрибут применяется, где остальная часть кода для нас, чтобы сделать редактирование в? –

ответ

3

Приведенный ниже код создаст исковое объявленное свойство.

Следует отметить, что автоматические свойства (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; 
     } 
    } 
}