【发布时间】:2011-04-08 11:25:05
【问题描述】:
首先要注意 - 我知道委托和装饰模式!
第二 - 我使用的是 C# .NET 4.0,所以如果你想出一个专门针对它的解决方案,那很好。但如果解决方案适用于任何 OOP 语言和平台,那就太好了。
问题来了……
我有一个部分类(让我们将其命名为Class1),我无法修改它。因此,我可以扩展它或/和继承它。这个类为我提供了一个完美的数据模型,我唯一需要的是向它的属性添加一些属性(用于验证,在 MVC 中定义标签文本值等 - 现在,我不需要像“你可以做你想做的事”这样的答案需要没有属性',这不是我的问题)。
使用另一个类作为数据模型不是问题,所以我可以说,创建Class2 : Class1 并使用Class2 作为模型。需要属性的属性将被定义为public new <type> <propertyname>。这将限制我只重写需要属性的属性,而保留所有其他属性。
较小的问题是我没有为属性重新定义 getter 和 setter,因为它们只包含 return base.<propertyname> 和 base.<propertyname> = value,如果有很多这样的属性,这意味着很多“愚蠢“编码。有没有办法避免这种情况?
更大的问题是我必须用Class1 实例对我的Class2 进行参数化,并为我拥有的每个属性制作类似class2.<propertyname> = class1.<propertyname> 的东西——太多的“愚蠢”编码。我可以使用反射来避免它 - 在 Class1 中找到所有具有公共 getter 和 setter 的属性,并在循环中调用 prop.SetValue(child, prop.GetValue(parent, null), null);。这为简单的情况提供了一个通用函数,这很好,因为我主要有简单的模型 - 很多带有公共 getter 和 setter 的属性,没有正文和其他逻辑。但我想要更通用的解决方案,我不喜欢反思。有什么想法吗?
这里是基于Class1创建Class2的扩展方法的完整代码
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;
}
(顺便说一句,这种方法可能无法理想地实现我的解决方案,因此也将不胜感激)
提前致谢!
【问题讨论】:
标签: c# oop reflection properties attributes