C# 创建从属性名称到具有该属性的类型的映射
我刚刚花了大约20分钟的时间试图找出是否有一种简洁的方法来填充这本词典:C# 创建从属性名称到具有该属性的类型的映射,c#,linq,reflection,C#,Linq,Reflection,我刚刚花了大约20分钟的时间试图找出是否有一种简洁的方法来填充这本词典: private Dictionary<string, List<Type>> _propertyMap; 您可以使用LINQ查询: var flags = BindingFlags.Public | BindingFlags.Instance; _propertyMap = _types.SelectMany(t => t.GetProperties(flags))
private Dictionary<string, List<Type>> _propertyMap;
您可以使用LINQ查询:
var flags = BindingFlags.Public | BindingFlags.Instance;
_propertyMap = _types.SelectMany(t => t.GetProperties(flags))
.GroupBy(p => p.Name)
.ToDictionary(g => g.Key,
g => g.Select(p => p.DeclaringType).ToList());
旁注-您可以使用ILookup
而不是Dictionary
,然后查询将按以下方式进行:
_propertyMap = _types.SelectMany(t => t.GetProperties(flags))
.ToLookup(p => p.Name, p => p.DeclaringType);
您可以使用LINQ查询:
var flags = BindingFlags.Public | BindingFlags.Instance;
_propertyMap = _types.SelectMany(t => t.GetProperties(flags))
.GroupBy(p => p.Name)
.ToDictionary(g => g.Key,
g => g.Select(p => p.DeclaringType).ToList());
旁注-您可以使用ILookup
而不是Dictionary
,然后查询将按以下方式进行:
_propertyMap = _types.SelectMany(t => t.GetProperties(flags))
.ToLookup(p => p.Name, p => p.DeclaringType);
我对这一点非常满意,并将继续接受这一点
然而,在我的特殊情况下,我后来遇到了麻烦,因为我有两种类型,其中一种继承自另一种。在这种情况下,DeclaringType
返回基类和派生类的基类
因此,我对它的调整,有点接近我最初推测的方法,是:
types.SelectMany(t => t
.GetProperties(BindingFlags.Public | BindingFlags.Instance)
.Select(p=>new{t,p}))
.GroupBy(p => p.p.Name)
.ToDictionary(g => g.Key, g => g.Select(p => p.t).ToList());
我对这一点非常满意,并将继续接受这一点
然而,在我的特殊情况下,我后来遇到了麻烦,因为我有两种类型,其中一种继承自另一种。在这种情况下,DeclaringType
返回基类和派生类的基类
因此,我对它的调整,有点接近我最初推测的方法,是:
types.SelectMany(t => t
.GetProperties(BindingFlags.Public | BindingFlags.Instance)
.Select(p=>new{t,p}))
.GroupBy(p => p.p.Name)
.ToDictionary(g => g.Key, g => g.Select(p => p.t).ToList());
@Damien_不信者谢谢,你是对的-在格式化代码以适应代码块宽度时无意中删除了它,无需使用其他
GroupBy
。只是types。选择many(x=>x.GetProperties(flags)).ToLookup(x=>x.Name,x=>x.DeclaringType)
@Damien\u不信者谢谢,你是对的-在格式化代码以适应代码块宽度时无意中删除了它,无需使用其他GroupBy
。只需types.SelectMany(x=>x.GetProperties(flags)).ToLookup(x=>x.Name,x=>x.DeclaringType)