Первое, что нужно отметить - я ЗНАЮ ШАБЛОНЫ ДЕЛЕГАЦИИ И ДЕКОРАТОРА!
Второе - я использую C # .NET 4.0, так что если вы придумали решение, специфичное для него, это нормально.Но если решение будет работать для любого языка и платформы ООП, это было бы замечательно.
И здесь возникает вопрос ...
У меня есть частичный класс (назовем его Class1
), который я не могу изменить.Таким образом, я могу просто расширить его или / и наследовать от него.Этот класс предоставляет мне идеальную модель данных, единственное, что мне нужно, это добавить некоторые атрибуты к его свойствам (для проверки, определения значения текста метки в MVC и т. Д. - пока мне не нужны ответы типа «вы можете делать то, что вынужно без атрибутов », это не вопрос моего вопроса).
Нет проблем в использовании другого класса в качестве модели данных, поэтому я могу, скажем, создать Class2 : Class1
и использовать Class2
в качестве модели.Свойства, которые требуют атрибутов, будут определены как public new <type> <propertyname>
.Это ограничит меня переписыванием только тех свойств, которые нуждаются в атрибутах, оставляя все остальные нетронутыми.
Меньшая проблема заключается в том, что мне не нужно переопределять методы получения и установки для свойств, поскольку все, что они будут содержать, это return base.<propertyname>
и base.<propertyname> = value
, и если таких свойств много, это означает много «глупого» кодирования.Есть ли способ избежать этого?
Большая проблема в том, что мне нужно параметризовать мой Class2
с экземпляром Class1
и сделать что-то вроде class2.<propertyname> = class1.<propertyname>
для каждого отдельного свойства, которое у меня есть - слишком много "глупая кодировка.Я могу избежать этого, используя отражение - найдите все свойства с общедоступными методами получения и установки в Class1
и вызовите prop.SetValue(child, prop.GetValue(parent, null), null);
в цикле.Это обеспечивает универсальную функцию для простых случаев, что вполне нормально, поскольку у меня в основном простые модели - множество свойств с открытыми геттерами и сеттерами без тела и другой логики.Но я хочу более общего решения, и я не люблю отражения.Любые идеи?
Вот полный код метода расширения, который создает Class2
на основе Class1
public static Child ToExtendedChild<Parent, Child>(this Parent parent)
where Child : Parent, new()
{
Child child = new Child();
var props = typeof(Parent).GetProperties().Where(p => p.GetAccessors().Count() >= 2);
foreach (var prop in props)
{
prop.SetValue(child, prop.GetValue(parent, null), null);
}
return child;
}
(кстати, этот метод не может идеально реализовать мое решение, поэтому любые исправления также приветствуются)
Заранее спасибо!