因此,之前已经在 SO 上讨论过这个问题,但是我认为我没有真正看到过为什么会发生这种情况的解释,我似乎也无法了解这对尝试在代码中使用反射的普通开发人员有何用处。
所以检查一下这段代码。
var fields = typeof(Person).GetFields(BindingFlags.DeclaredOnly | BindingFlags.NonPublic | BindingFlags.Instance);
如果我的对象List<int>
中有一个,Person
那么我将取回一个反射“名称”设置为的字段List`1
,或者如果我有一本字典,它将是Dictionary`2
。从表面上看,这似乎很难处理,我不能说以下
foreach (var fieldInfo in fields.Where(fieldInfo => fieldInfo.FieldType == typeof(List<int>)))
{
//Do something.
}
出现这种情况的原因是因为我在我目前正在从事的项目中发现了以下内容。
//Initialize collections
FieldInfo[] properties = type.GetFields(BindingFlags.DeclaredOnly | BindingFlags.NonPublic | BindingFlags.Instance);
foreach (FieldInfo f in properties)
{
if (f.FieldType.Name == "IList`1" && f.GetValue(obj) == null)
{
object value = Container.Resolve(f.FieldType);
f.SetValue(obj, value);
}
}
然后在统一的配置中我看到了这种幸福
<alias alias="IList`1" type="System.Collections.Generic.IList`1, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
我真的不知道我知道这很糟糕?是吗?它当然有效,但即使这没问题(这会导致我的可疑代码 dar 消失),我最初的问题仍然存在。作为程序员,关于泛型的维度信息对我们有什么好处?