【发布时间】:2015-03-25 22:24:39
【问题描述】:
考虑这种情况:
public class Base
{
public int i;
}
public class Sub : Base
{
public void foo() { /* do stuff */}
}
然后我想,给定Base 的实例,获取Sub 的克隆实例(在这种情况下,i=17),以便我可以在子类中调用foo。
Base b = new Base { i=17 };
Sub s = CloneAndUpcast(b);
s.foo();
但是,我怎样才能创建CloneAndUpcast?
我认为应该可以使用反射递归地克隆所有Base-members 和属性。但相当多的工作。
谁有更好、更简洁的想法?
附言。我正在考虑使用它的场景是树状结构中的一组“简单”类(这里没有循环图或类似的),并且所有类都是简单的值持有者。计划是有一个愚蠢的层来保存所有值,然后是一组类似的类(子类),实际上包含一些价值持有者不应该知道的业务逻辑。一般不好的做法是的。我认为它适用于这种情况。
【问题讨论】:
-
你不能完全按照你的要求去做。有很多原因,但我只想说,即使可以,这通常是一种不好的做法。如果您可以向我们提供您想要解决的更广泛的问题,我们可以帮助您找到正确的模式。
-
这听起来像是一个特定的问题,表明一个更普遍的问题正在以错误的方式解决。旧鞋和玻璃瓶都不合适。见:weblogs.asp.net/alex_papadimoulis/archive/2005/05/25/…
-
我认为您尝试实现的目标可能表明存在设计问题。此外,由于
i是base类的私有,所以sub无论如何都不能使用它,因此根据Base的工作原理,不需要复制该字段。 -
@tobsen -
i旨在作为公共成员的示例。对不起。
标签: c# reflection