Мы собираемся сделать отражатель в моей компании.
Мне нужен FactoryClass, который может преобразовать IDictionary в obj, сопоставляя свойства и ключи dict.
IНайдено:
Свойство динамического свойства объекта (без отражения)
Этот код может делать то, что я хочу, и я хочу использовать этот код, потому что это делается с помощьюосновы 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.
}
Тогда возникает вопрос, почему и как это решить?В трассировке стека нет ничего лишнего.
// dennis