Мы собираемся сделать какой-то отражатель в моей компании.IDictionary <obj, obj> to obj using emit
Мне нужен FactoryClass, который может преобразовать IDictionary в obj, выполнив соответствие по свойствам и клавишам dict.
я нашел:
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. –