2015-04-29 9 views
5

ho scritto un metodo per ottenere Attributo valore dell'immobile:Come ottenere Attributo Valore in 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; 
} 

Per esempio: ho Attributo [Map(Name = "MenuItem, Availability")]

chiamo GetAttributeValueByNameAttributeAndProperty (CodeClass, "Mappa" , "Nome") Dopo questo metodo ottenere CodeAttribute.Value e stringa di restituzione: Name = "MenuItem, Availability" Dopo aver rimosso "Name =" e caratteri aggiuntivi e diviso per ","

Ma il mio Senior Programmer mi ha detto che questo metodo non è flessibile e ho bisogno di trovare un modo più conveniente per ottenere i dati interni in CodeAttribute.Value.

Avete idee/esempi?

+0

Ho modificato il titolo. Per favore vedi, "[Le domande dovrebbero includere" tag "nei loro titoli?] (Http://meta.stackexchange.com/questions/19190/)", dove il consenso è "no, non dovrebbero". –

+0

Grazie. Lo prenderò in considerazione –

+0

Stavo cercando un modo per leggere i valori degli attributi usando il modello di codice. Poi sono arrivato alla tua domanda e dal momento che non aveva una risposta, ne ho pubblicato uno. So che la domanda è piuttosto vecchia e probabilmente non hai più bisogno della risposta, ma i futuri lettori potrebbero trovare utile :) –

risposta

2

È possibile utilizzare la proprietà CodeClass.Attributes per ottenere gli attributi di una classe. Ogni attributo è di tipo CodeAttribute e ha una Name e una proprietà Children che contiene argomenti dell'attributo. Ogni argomento è di tipo CodeAttributeArgument con proprietà Name e Value.

Esempio

Ora avete tutte le informazioni che è necessario per ottenere attribuire valore da CodeAttribute. Ecco un esempio. Ho decorato Program classe con un attributo [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; } 
    } 
} 

Ed ecco il campione T4 modello:

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

Se si esegue il modello, si riceverà "Something" in uscita.