Создание динамического класса с использованием словаря<string, object>
У меня есть класс CoverageBase со свойствами, скажем, A, B, C. И теперь, основываясь на некоторых проверках, мне нужно добавить n свойств, скажем, D и E, в этот класс CoverageBase вместе с моими существующими A, B, C. для создания D и E динамически во время выполнения я использую словарь
class CoverageBase
{
public string A { get; set; }
public string B { get; set; }
public string C { get; set; }
}
Dictionary<string, object> values = new Dictionary<string, object>()
{
{"D",5},{"E",123}
};
var test = GetObject<CoverageBase>(values);
T GetObject<T>(Dictionary<string,object> dict)
{
Type type = typeof(T);
var obj = Activator.CreateInstance(type);
foreach (var kv in dict)
{
type.GetProperty(kv.Key).SetValue(obj, kv.Value);
}
return (T)obj;
}
Проблема с вышеупомянутым подходом состоит в том, что, когда я пытаюсь получить GetProperty, используя "D", не будет никакого свойства, существующего в этом имени в праве класса CoverageBase. так что выкинет ошибку. Итак, как мне построить ожидаемый класс со свойствами A, B, C, D, E
Можем ли мы использовать для этого какие-либо из существующих инструментов, таких как ExpandoObject или DynamicObject?
1 ответ
Важная вещь, которую следует помнить с C# и другими языками.Net - это разница между строго типизированными классами и не строго типизированными классами. На практике динамику (не строго типизированную) обычно считают ленивым подходом к быстрому развитию. Не рекомендуется использовать динамику в качестве универсального подхода, если в этом нет особой необходимости.
Существуют способы выполнить то, к чему вы стремитесь, однако в конечном итоге вам придется использовать динамику во время выполнения, когда вы хотите взаимодействовать с вашим классом.
То, на что вы должны смотреть, это Newtonsoft.Json. Используя Json, вы можете преобразовать класс C# в JObject, а затем манипулировать им, как будто это словарь. Это позволит вам добавлять дополнительные поля и свойства, но не методы. Когда вы закончите модифицировать свой объект, вы можете преобразовать его обратно в динамический, а затем взаимодействовать с ним как с обычным объектом расширения.
Если вы действительно хотите создать строго типизированный класс во время выполнения, то вам нужно изучить компиляцию во время выполнения. Это будет использовать поставщик C# CodeDom и позволит вам скомпилировать "текст" в сборки C Sharp, которые содержат один или несколько типов. Эти типы могут быть чем угодно, что успешно компилируется из предоставленного вами ввода текста.