2016-04-28 3 views
0

Ich habe das folgende AttributHolen Sie Attributobjekt von INamedTypeSymbol.GetAttributes(), d. H. AttributeData Objekt?

[AttributeUsage(AttributeTargets.Class)] 
class DemoAttribute : Attribute 
{ 
    public string SomeInfo { get; } 

    public DemoAttribute(string someInfo) 
    { 
    this.SomeInfo = someInfo; 
    } 
} 

definiert, die zu einem gewissen Klasse angewendet werden können wie folgt:

[Demo("hello world")] 
class Program { } 

Eine INamedTypeSymbol Variable namedTypeSymbol auf die Program Klasse zeigt mir zur Verfügung gestellt, mit denen habe ich es geschafft Erhalte den Namen des Attributs.

foreach(var attr in namedTypeSymbol.GetAttributes()) 
{ 
    if(attr.AttributeClass.Name == "DemoAttribute") { ... } 
} 

Aber wie greife ich auf was als SomeInfo eingestellt wurde?

+0

Sie wissen nicht wirklich, wenn dies dazu beitragen wird (nicht an der Zeit zu prüfen, hatte), sondern versuchen, auf attr.NamedArguments Eigenschaft suchen. –

+0

@PonasJustas Stimmt es, dass es keine Möglichkeit gibt, Roslyn-Typen wie 'AttributeData' in Reflektionsarten wie' Attribute' zu ​​übersetzen? – David

+0

@David korrekt. Roslyn und Reflection sollten als zwei verschiedene Welten betrachtet werden. Manchmal haben sie eine ähnliche Darstellung (wie 'MetadataName'), aber tatsächliche Objekte übersetzen nirgends, soweit ich weiß. –

Antwort

1

Es gibt zwei Möglichkeiten, wie Sie Argumente an Attribute übergeben können. Entweder indem Sie die Eigenschaft ([Demo(SomeInfo="hello world")]) oder über den Konstruktor setzen, während Sie dies tun. Wenn Sie den genannten Ansatz verwenden, wäre Ponas korrekt, dass die Lösung in NamedArguments liegt. Wenn Sie den Konstruktor verwenden, befinden sich die Daten jedoch in ConstructorArguments. Dies ist ein Array von TypedConstant, von dem Sie den Wert "hello world" bekommen:

string attributeData = (string)attr.ConstructorArguments[0].Value;