【发布时间】:2014-09-18 17:24:47
【问题描述】:
假设我使用 CSharpCodeProvider 动态创建了一个类型,并选择不保留结果。生成的程序集仅存在于内存中。 假设我在两个不同的内存程序集中创建了两种类型:
组装1:
public class DynamicTypeA { }
组装2:
public class DynamicTypeB
{
public DynamicTypeA MyProperty { get; set; }
}
如您所见,第二种类型具有第一种类型的属性。 凉爽的。现在我想用反射来探索 DynamicTypeB:
foreach (PropertyInfo pi in typeof(DynamicTypeB).GetProperties())
{
Console.WriteLine(pi.PropertyType.Name);
}
事实证明,当程序集不在磁盘上时,PropertyInfo.PropertyType 失败!!! 对于 MemberInfo 和所有其他类型调查构造都是如此。
众所周知,许多 .Net API 在后端使用类型调查,当调查的类型恰好存在于内存程序集中时,它们会失败。例如 Expression.Bind 将 MemberInfo 作为第一个参数,并使用它来验证第二个参数中提供的表达式的类型是否与成员的类型匹配。当此类型恰好位于内存程序集中时,Expression.Bind 失败。
谁能想到解决办法?
动态创建类型并将它们写入磁盘会污染运行环境,这很糟糕,但如果没有反射,这些类型毫无价值。
谢谢 手动
【问题讨论】:
标签: c# reflection