2016-06-07 15 views
0

在編寫lambda-method語法時,我想要一個函數,讓所有具有屬性的類打印每個類名稱及其屬性。C#在linq中創建本地字符串變量 - lambda表達式

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))); 

輸出:

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

據我所知,在輸出中的最後一行,是因爲使用本地lambda表達式變量。

如何避免顯示最後一行?

+2

你可以檢查if(type.IsDefined(typeof(CompilerGeneratedAttribute),false))並跳過它。 – riteshmeher

+0

謝謝!有用。 –

+0

很高興爲您效勞! – riteshmeher

回答

0

您可以檢查一個類型有一個CompilerGeneratedAttribute這樣的:

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

如果一個類型由編譯器(而不是開發者)創建的,該類型有一個CompilerGeneratedAttribute。上述代碼中的Where()將過濾掉所有具有此屬性的類型。

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

正如評論中所述。

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)); 

您可以選擇這個link。它會告訴您關於CompilerGeneratedAttribute的正確用法。