2016-06-07 7 views
0

Beim Schreiben einer Lambda - Methodensyntax möchte ich eine Funktion, die für alle Klassen mit Attributen jeden Klassennamen und seine Attribute ausgibt.C# Erstellen einer lokalen String - Variablen in linq - Lambda - Ausdruck

var x1 = Assembly.GetExecutingAssembly() 
    .GetTypes() 
    .Select(type => type 
     .GetCustomAttributes(false) 
     .Select(attribute => type.Name + " - " + attribute.ToString()) 
     .ToList()) 
    .ToList(); 

x1.ForEach(type => type.ForEach(str => Console.WriteLine(str))); 

Ausgang:

<ClassName> - <ProgramName>.<AttributeName> 
<ClassName> - <ProgramName>.<AttributeName> 
<>c__DisplayClass6 - System.Runtime.CompilerServices.CompilerGeneratedAttribute 

Ich verstehe, dass die letzte Zeile in der Ausgabe, da ist einen lokalen Lambda-Ausdruck Variable.

Wie vermeidet man die Anzeige der letzten Zeile?

+2

können Sie wie If überprüfen (type.IsDefined (typeof (CompilerGeneratedAttribute), false)) und es überspringen. – riteshmeher

+0

danke! Es klappt. –

+0

froh, Ihnen zu helfen! – riteshmeher

Antwort

0

können Sie überprüfen, ob ein Typ mit einem CompilerGeneratedAttribute so hat:

var x1 = Assembly.GetExecutingAssembly() 
    .GetTypes().Where(type => type.GetCustomAttribute<CompilerGeneratedAttribute>() == null) 
    .Select(type => type.GetCustomAttributes(false) 
     .Select(attribute => type.Name + " - " + attribute.ToString()) 
    .ToList()).ToList(); 

Wenn ein Typ vom Compiler erstellt wird (anstelle des Entwicklers), diese Art eine CompilerGeneratedAttribute hat. Die Where() im obigen Code filtert alle Typen heraus, die dieses Attribut haben.

0
var x1 = Assembly.GetExecutingAssembly() 
    .GetTypes() 
    .Where(type => !type.IsDefined(typeof(CompilerGeneratedAttribute), false))) 
    .Select(type => type 
     .GetCustomAttributes(false) 
     .Select(attribute => type.Name + " - " + attribute.ToString()) 
     .ToList()) 
    .ToList(); 

x1.ForEach(type => type.ForEach(str => Console.WriteLine(str))); 
0

Wie im Kommentar erwähnt.

var x1 = Assembly.GetExecutingAssembly() 
      .GetTypes() 
      .Where(type=>!type.IsDefined(typeof(CompilerGeneratedAttribute), false)) 
      .Select(type => type 
       .GetCustomAttributes(false) 
       .Select(attribute => type.Name + " - " + attribute.ToString()) 
       .ToList()) 
      .ToList(); 
      x1.ForEach(type => type.ForEach(Console.WriteLine)); 

Sie können die link überprüfen. Es informiert Sie über die korrekte Verwendung von CompilerGeneratedAttribute.

Verwandte Themen