【问题标题】:How can I call MemberwiseClone()?如何调用 MemberwiseClone()?
【发布时间】:2011-08-29 06:59:16
【问题描述】:

我对如何使用MemberwiseClone() 方法感到困惑。我查看了 MSDN 中的示例,他们通过 this 关键字使用它。

为什么我不能像GetType()ToString() 这样的其他对象的方法直接调用它?另一个没有出现的相关方法是ShallowCopy()

如果它们是 Object 类的一部分,为什么我看不到它们?

【问题讨论】:

    标签: c# object clone


    【解决方案1】:

    MemberwiseClone() 函数是protected,所以你只能通过你自己类型的限定符来访问它。

    【讨论】:

    • 该死的我还是不明白。例如查看 msdn.microsoft.com/es-es/library/bcd5672a(VS.80).aspx 中的 DerivedPoint 示例,派生类直接访问受保护的继承成员,而使用 MemberwiseClone 我不能这样做
    • @voodoomsr:“我不明白”你是说你不明白“受保护”是什么意思,或者你不明白为什么要保护该方法?跨度>
    • @Eric 查看我输入的网址中的示例。在 DerivedPoint 实例中,它们直接访问继承的受保护成员。我不明白为什么这很好,而我却试图不这样做。
    • @voo:您可以使用MemberwiseClone 做到这一点,只要限定符属于您的类型
    • @voodoomsr:受保护访问的规则有点复杂,是的。加起来。假设基类 B 有一个受保护的方法 M。B 有派生类 D 和 E。从 D 内部进行的调用的形式为 r.M()。 r 的编译时类型必须是 D 或从 D 派生的类型。r 的类型可能不是 E,因为 E.M 不能从 D 访问; D 无法调用 E 的受保护成员。 r 的类型可能不是 B,因为 r 可能在运行时是 E。
    【解决方案2】:

    这是一个例子,这是我做的,到目前为止没有问题。

    public class ModelBase
    {
        public T ShallowCopy<T>() where T : ModelBase
        {
            return (T)(MemberwiseClone());
        }
    }
    

    然后这样称呼它:

    var cloned = User.ShallowCopy<User>();
    

    【讨论】:

    • 这个方法不是很通用。这是一个荣耀的演员阵容。你可以这样写,它会编译:var cloned = user.ShallowCopy&lt;Car&gt;(); 但在执行时崩溃,因为用户不是汽车。
    猜你喜欢
    • 1970-01-01
    • 2012-10-31
    • 2014-06-24
    • 1970-01-01
    • 2017-06-19
    • 2011-03-10
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多