Я пытаюсь преобразовать словарь в привязанность к интерфейсу.Преобразование словаря в интерфейс
Я могу получить словарь для объекта в порядке. Делая что-то вроде этого:
public static class ObjectExtensions
{
public static T ToObject<T>(this IDictionary<string, object> source)
where T : class, new()
{
var someObject = new T();
var someObjectType = someObject.GetType();
foreach (var item in source)
{
someObjectType.GetProperty(item.Key).SetValue(someObject, item.Value, null);
}
return someObject;
}
public static IDictionary<string, object> AsDictionary(this object source, BindingFlags bindingAttr = BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance)
{
return source.GetType().GetProperties(bindingAttr).ToDictionary
(
propInfo => propInfo.Name,
propInfo => propInfo.GetValue(source, null)
);
}
}
var dictionary = new Dictionary<string, object> {{"Prop1", "hello world!"}, {"Prop2", 3893}};
var someObject = dictionary.ToObject<A>();
Но я хочу, чтобы иметь возможность:
var someObject = dictionary.ToObject<iA>();
Любой знает, как это можно сделать?
Для меня было ужасно писать метод расширения объекта без уважительной причины. –
Вы на самом деле просто пытаетесь сделать сериализацию? Если это так, есть намного более простые способы. Например. найдите DataContractSerializer для XML или Json.NET для JSON. –
Если вы пытаетесь разработать это для модульного тестирования, вам может потребоваться использовать существующую фальшивую инфраструктуру, такую как Moq. Эти рамки уже имеют поддержку для создания классов «на лету», которые реализуют интерфейс, и вы можете легко создать вспомогательный метод, который конвертирует словарь в последовательность вызовов Moq Setup. –