从 IEnumerable<anonymousType> 获取值

Get Values from IEnumerable<anonymousType>

我有代码可以从 PropertyInfo 和 return 中获取 DisplayNameAttribute 和 return 一对

{Propertyname = "", DisplayName = ""}
public static IEnumerable GetDisplayNames<T>() => typeof(T).GetProperties()
                  .Where(p => p.IsDefined(typeof(DisplayNameAttribute), false))
                  .Select(p => new
                  {
                      PropertyName = p.Name,
                      DisplayName = p.GetCustomAttributes(typeof(DisplayNameAttribute),
                              false).Cast<DisplayNameAttribute>().Single().DisplayName
                  });

没问题,但我想我不太了解匿名类型,我想知道如何 return 为特定项目赋值(如果可能的话 - 尽管必须这样做)。

我认为它像 Dictionary 一样工作,但现在我知道它不是。 为了简化问题:

如何遍历这样的构造?

如果您想获得一个包含 属性 元组和显示名称的枚举,那么...

... 使用 tuples:

public static IEnumerable<(string propertyName, string displayName)> GetDisplayNames<T>()
    => typeof(T).GetProperties()
        .Where(p => p.IsDefined(typeof(DisplayNameAttribute), false))
        .Select(p =>
            (
                propertyName: p.Name,
                displayName: p.GetCustomAttributes(typeof(DisplayNameAttribute), false)
                                 .Cast<DisplayNameAttribute>().Single().DisplayName
            )
        );

或者您正在寻找像这样的字典:

public static Dictionary<string, string> GetDisplayNames<T>() =>
    typeof(T).GetProperties()
        .Where(p => p.IsDefined(typeof(DisplayNameAttribute), false))
        .ToDictionary(
            p => p.Name, // Key
            p.GetCustomAttributes(typeof(DisplayNameAttribute), false) 
             .Cast<DisplayNameAttribute>()         
             [0] // Linq not really required
             .DisplayName); // Value