2015-04-29 28 views
5
yılında Öznitelik Değeri olsun nasıl

Ben Değer By Mülkiyet Özellik alma yöntemini yazdı:CodeAttribute

Örnek için
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; 
} 

: Ben (codeclass GetAttributeValueByNameAttributeAndProperty diyoruz [Map(Name = "MenuItem, Availability")]

Özellik var, "Harita" , "Ad") Bu yöntemden sonra CodeAttribute.Value ve return dizesini alırsınız: Name = "MenuItem, Availability" "Name =" ve fazladan karakterleri ve Split'i kaldırdıktan sonra ","

Ancak Üst Düzey Programcım, bu yöntemin esnek olmadığını ve CodeAttribute.Value'da iç verileri almanın daha uygun bir yolunu bulmam gerektiğini söyledi.

Herhangi bir fikriniz/örneğiniz var mı?

+0

Başlığınızı düzenledim. Lütfen, "[Sorular soruların başlığında" etiketler içeriyor mu? "(Http://meta.stackexchange.com/questions/19190/)" bölümüne bakacak olursak, fikir birliği "hayır, yapmamalı" dır. –

+0

Teşekkürler. Onu –

+0

hesaba katarım Kod modelini kullanarak öznitelik değerlerini okumak için bir yol arıyordum. Sonra soruna geldim ve bir cevabı olmadığından ben bir tane gönderdim. Ben soru oldukça eski ve muhtemelen cevabı artık gerek yok, ama gelecekteki okuyucular yararlı bulabilir :) –

cevap

2

Bir sınıfın niteliklerini almak için CodeClass.Attributes özelliğini kullanabilirsiniz. Her öznitelik CodeAttribute türünde ve Name ve özniteliğin bağımsız değişkenlerini içeren bir Children özelliğine sahiptir. Her bir argüman, Name ve Value özelliklerine sahip CodeAttributeArgument türündedir.

Örnek Şimdi de CodeAttribute gelen öznitelik değeri almak için gereken tüm bilgilere sahibiz. İşte bir örnek. Ben [MySample(Property1 = "Something")] özniteliği

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

ile Program sınıf dekore ettik Ve burada örnek T4 şablon: şablonu çalıştırırsanız

<#@ 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); 
    } 
} 
#> 

, çıktıda "Something" alacaktır.