C#在linq中创建一个本地字符串变量 - lambda表达式

时间:2016-06-07 14:36:47

标签: c# linq lambda

在编写lambda方法语法时,我想要一个函数,对于所有具有属性的类,打印每个类名及其属性。

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

输出:

    https://api.newrelic.com/v2/applications.json?filter[ids]=1739407

我理解输出中的最后一行是因为使用了本地lambda表达式变量。

如何避免显示最后一行?

3 个答案:

答案 0 :(得分: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()会过滤掉所有具有此属性的类型。

答案 1 :(得分: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)));

答案 2 :(得分: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的正确用法。