C#中OfType不可用时,如何获取特定的自定义属性?

How to obtain a specific custom attribute when OfType is not available in C#?

在我的应用程序中,我尝试使用 foreach 循环获取特定属性:

foreach 的数据源:

现在我想检查每个 属性 是否具有“EditTemplate”CustomAttribute,如果 属性 具有它,则将此属性放入这样的变量中:

前叉:

@foreach (var property in EditObject.GetType().GetProperties())
{
      var attributes = property.GetCustomAttributes(true);
      var DoSomeAttribute = attributes;

      //THIS IS THE PART THAT DOES NOT WORK BECAUSE .OfType is not recognized
      //var attribute = property.GetCustomAttributes(true).OfType<EditTemplateAttribute>().FirstOrDefault();
}

代码行“var attributes = property.GetCustomAttributes(true)”给我一个包含 x 个项目(属性在其中)的对象:

现在这是我要检查属性是否属于“EditTemplateAttribute”类型的地方,如果是这种情况,我想将其放入这样的变量中:

在另一段代码(和另一个 foreach)中,我通过以下方式实现了这一点:

var attribute = property.GetCustomAttributes(true).OfType<EditTemplateAttribute>().FirstOrDefault();

但是 .OfType 在这里不可用。

有人知道如何实现吗?

提前致谢!

我不知道为什么 .OfType 应该不可用。 尝试添加 using System.Linq。这是定义 OfType 扩展方法的命名空间。

我注意到您的 foreach 以“@”为前缀。您使用的是 MVC Razor 视图吗? 在这种情况下,您可以使用以下方式添加:@using System.Linq

在任何情况下,您都可以将 .OfType<EditTemplateAttribute>() 替换为:

.Where(x => x is EditTemplateAttribute).Select(x => (EditTemplateAttribute)x)

或者您可以使用(可能 return 属性实例或 null):

var someAttribute = (EditTemplateAttribute)attributes.FirstOrDefault(x => x is EditTemplateAttribute);

或者,您可以编写自己的 OfType 扩展方法(并按照您的意愿使用它):

public static IEnumerable<TResult> OfType<TResult>(this IEnumerable source)
{
  foreach (object obj in source)
  {
    if (obj is TResult)
      yield return (TResult) obj;
  }
}