无法访问受保护的成员'object.MemberwiseClone()'

Xen*_*ate 21 c# clone

我正在尝试使用我.MemberwiseClone()的自定义类,但它会引发此错误:

Cannot access protected member 'object.MemberwiseClone()' via a qualifier of type 'BLBGameBase_V2.Enemy'; the qualifier must be of type 'BLBGameBase_V2.GameBase' (or derived from it)
Run Code Online (Sandbox Code Playgroud)

这是什么意思?或者更好的是,我如何克隆一个Enemy类?

SLa*_*aks 37

在任何类中X,您只能MemberwiseClone在实例上调用(或任何其他受保护的方法)X.(或从中派生的类X)

由于Enemy您尝试克隆的GameBase类不会继承您尝试克隆它的类,因此您会收到此错误.

要解决此问题,请添加一个公共Clone方法Enemy,如下所示:

class Enemy : ICloneable {
    //...
    public Enemy Clone() { return (Enemy)this.MemberwiseClone(); }
    object ICloneable.Clone() { return Clone(); }
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,但是你不能调用另一个类的受保护方法,除非它继承自_you_.否则,您只需继承该类,就可以在任何类上调用任何受保护的成员(包括`MemberwiseClone`).这会让`protected`几乎无用. (5认同)
  • 但我认为MemberwiseClone是一个Object的方法,所有类都是从这个方法中解脱出来的? (2认同)

Mod*_*dMa 28

  • 你不能直接使用MemberwiseClone(),你必须通过派生类实现它(推荐)
  • 但是,通过反思,你可以欺骗它:)
  • 您可以将此litle扩展名用于未实现ICloneable的类:

    /// <summary>
    /// Clones a object via shallow copy
    /// </summary>
    /// <typeparam name="T">Object Type to Clone</typeparam>
    /// <param name="obj">Object to Clone</param>
    /// <returns>New Object reference</returns>
    public static T CloneObject<T>(this T obj) where T : class
    {
        if (obj == null) return null;
        System.Reflection.MethodInfo inst = obj.GetType().GetMethod("MemberwiseClone",
            System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
        if (inst != null)
            return (T)inst.Invoke(obj, null);
        else
            return null;
    }
    
    Run Code Online (Sandbox Code Playgroud)

  • 我无法理解为什么MemberwiseClone不公开......而上述"作弊"非常有用!竖起大拇指! (5认同)
  • @Shaamaan:它不是公共的,因为由类所有者决定克隆应该如何工作;逐位克隆任意类不一定安全。例如,按位克隆“ Thread”实例意味着什么? (2认同)