Nous sommes sur le point de faire un réflecteur dans mon entreprise.IDictionary <obj, obj> à obj en utilisant l'émission
J'ai besoin d'une FactoryClass qui peut convertir un IDictionary en obj, en faisant correspondre les propriétés et les clés dict.
Je trouve:
Dynamic object property populator (without reflection)
Ce code peut faire ce que je veux, et je veux utiliser ce code, parce qu'il est fait en utilisant la base de dotNET sans utiliser les extensions des autres.
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>();
...
Lorsque j'ai testé ce code, j'ai reçu une erreur.
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;
}
je suis arrivé et erreur ici
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.
}
question Wy est pourquoi, et comment le résoudre? Il n'y a rien en extra dans la pile.
// dennis
Le problème est certainement dans le code qui génère le délégué 'Load', mais vous n'avez pas publié cette partie, donc nous ne pouvons pas vraiment vous aider ... –
C'est une exception d'intérêt mais il est complètement impossible de repro le avec le code fourni. Très peu clair comment _handler est initialisé. Si vous utilisez Reflection.Emit alors vous venez de foirer l'IL. –