【发布时间】:2010-09-30 11:51:49
【问题描述】:
我们即将在我的公司做一些反射器。
我需要一个 FactoryClass,它可以通过对属性和字典键进行匹配来将 IDictionary 转换为 obj。
我找到了:
Dynamic object property populator (without reflection)
这段代码可以做我想做的,我想使用这段代码,因为它是通过使用dotNET的基础完成的,而不使用其他扩展。
public class Populator<T>
{
private delegate T Load(Dictionary<string, object> properties);
private Load _handler;
private Populator() { }
public T Build(Dictionary<string, object> properties)
{
return _handler(properties);
}
public static Populator<T> CreateBuilder(Dictionary<string, object> properties)
{
//private static readonly MethodInfo getValueMethod = typeof(IDataRecord).GetMethod("get_Item", new [] { typeof(int) });
//private static readonly MethodInfo isDBNullMethod = typeof(IDataRecord).GetMethod("IsDBNull", new [] { typeof(int) });
Populator<T> dynamicBuilder = new Populator<T>();
...
当我测试这段代码时,我得到了一个错误。
public ICollection<object> GetKeys(IDictionary<object, object> products)
{
IDictionary<object, object> product = (IDictionary<object, object>)products.ElementAt(0).Value;
Dictionary<string, object> p = new Dictionary<string, object>();
foreach (KeyValuePair<object, object> item in product)
{
p.Add(item.Key.ToString(), item.Value);
}
Populator<ProductTest> builder = Populator<ProductTest>.CreateBuilder(p);
ProductTest obj = builder.Build(p); // error here
return null;
}
这里有错误
public class Populator<T>
{
private delegate T Load(Dictionary<string, object> properties);
private Load _handler;
private Populator() { }
public T Build(Dictionary<string, object> properties)
{
return _handler(properties); // Error: JIT Compiler encountered an internal limitation.
}
Wy 的问题是为什么,以及如何解决它? 堆栈跟踪中没有任何额外内容。
//丹尼斯
【问题讨论】:
-
问题肯定出在生成
Load委托的代码中,但您没有发布该部分,所以我们无法真正帮助您... -
这是一个兴趣例外,但完全不可能用提供的代码重现它。非常不清楚 _handler 是如何初始化的。如果您使用任何 Reflection.Emit,那么您只是搞砸了 IL。
标签: c# dictionary reflection.emit