2015-04-29 26 views
5

Tôi đã viết một phương pháp để có được Thuộc tính Giá trị Bằng tài sản:Làm thế nào được Thuộc tính giá trị trong CodeAttribute

public string GetAttributeValueByNameAttributeAndProperty(CodeClass cc, string nameAttribute, string nameProperty) 
{ 
    var value = ""; 
    foreach(CodeAttribute ca in cc.Attributes) 
      { 
       if(ca.Name.Contains(nameAttribute) && ca.Value.Contains(nameProperty)) 
       { 
        value = ca.Value.Remove(0,ca.Value.IndexOf(nameProperty)); 
        value = value.Replace(" ",""); 
        if(value.Contains(",")) 
         value = value.Remove(ca.Value.IndexOf(",")); 
       } 
      } 

    return value; 
} 

Ví dụ: Tôi có thuộc tính [Map(Name = "MenuItem, Availability")]

tôi gọi GetAttributeValueByNameAttributeAndProperty (codeclass, "Bản đồ" , "Tên") Sau khi phương thức đó nhận được CodeAttribute.Value và trả về chuỗi: Name = "MenuItem, Availability" Sau khi tôi xóa "Name =" và các ký tự thừa và Split by ","

Nhưng lập trình viên cao cấp của tôi nói với tôi rằng phương pháp này là không linh hoạt và tôi cần tìm một cách thuận tiện hơn để lấy dữ liệu bên trong trong CodeAttribute.Value.

Bạn có ý tưởng/ví dụ nào không?

+0

Tôi đã chỉnh sửa tiêu đề của bạn. Vui lòng xem, "[Câu hỏi có nên bao gồm" thẻ "trong tiêu đề của họ không?] (Http://meta.stackexchange.com/questions/19190/)", trong đó sự đồng thuận là "không, họ không nên". –

+0

Cảm ơn. Tôi sẽ đưa nó vào tài khoản –

+0

Tôi đã tìm kiếm một cách để đọc các giá trị thuộc tính bằng cách sử dụng mô hình mã. Sau đó, tôi đến câu hỏi của bạn và vì nó không có câu trả lời nên tôi đã đăng một câu hỏi. Tôi biết câu hỏi là khá cũ và có lẽ bạn không cần câu trả lời nữa, nhưng độc giả trong tương lai có thể thấy nó hữu ích :) –

Trả lời

2

Bạn có thể sử dụng CodeClass.Attributes thuộc tính để nhận thuộc tính của lớp học. Mỗi thuộc tính có loại CodeAttribute và có một thuộc tính Name và thuộc tính Children chứa đối số của thuộc tính. Mỗi đối số là loại CodeAttributeArgument trong đó có các thuộc tính NameValue.

Ví dụ

Bây giờ bạn có tất cả thông tin mà bạn cần phải nhận được thuộc tính giá trị từ CodeAttribute. Đây là một ví dụ. Tôi đã được trang trí Program lớp với một thuộc tính [MySample(Property1 = "Something")]

using System; 
namespace ConsoleSample 
{ 
    [MySample(Property1 = "Something")] 
    class Program 
    { 
     static void Main(string[] args) 
     { 
     } 
    } 
    public class MySampleAttribute : Attribute 
    { 
     public string Property1 { get; set; } 
    } 
} 

Và đây là mẫu T4 mẫu:

<#@ template debug="true" hostSpecific="true" #> 
<#@ output extension=".txt" #> 
<#@ assembly Name="System.Core" #> 
<#@ assembly name="EnvDte" #> 
<#@ assembly name="EnvDte80" #> 
<#@ import namespace="System" #> 
<#@ import namespace="System.Linq" #> 
<#@ import namespace="System.Collections.Generic" #> 
<#@ import namespace="EnvDTE" #> 
<#@ import namespace="EnvDTE80" #> 
<#  
var env = (this.Host as IServiceProvider).GetService(typeof(EnvDTE.DTE)) as EnvDTE.DTE; 
var project = env.Solution.FindProjectItem(this.Host.TemplateFile).ContainingProject 
    as EnvDTE.Project; 
var codeClass = project.ProjectItems.Item("Program.cs").FileCodeModel.CodeElements 
         .OfType<CodeNamespace>().ToList()[0] 
         .Members.OfType<CodeClass>().ToList()[0]; 
var attribute = codeClass.Attributes.Cast<CodeAttribute>() 
         .Where(a=>a.Name=="MySample").FirstOrDefault(); 
if(attribute!=null) 
{ 
    var property = attribute.Children.OfType<CodeAttributeArgument>() 
          .Where(a=>a.Name=="Property1").FirstOrDefault(); 
    if(property!=null) 
    { 
     var value = property.Value; 
     WriteLine(value); 
    } 
} 
#> 

Nếu bạn chạy các mẫu, bạn sẽ nhận được "Something" ở đầu ra.

Các vấn đề liên quan