Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 创建从属性名称到具有该属性的类型的映射_C#_Linq_Reflection - Fatal编程技术网

C# 创建从属性名称到具有该属性的类型的映射

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

我刚刚花了大约20分钟的时间试图找出是否有一种简洁的方法来填充这本词典:

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)