web-dev-qa-db-ja.com

保護されたメンバー 'object.MemberwiseClone()'にアクセスできません

私のカスタムクラスで.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)

これは何を意味するのでしょうか?さらに良いことに、どうすればEnemyクラスのクローンを作成できますか?

21
Xenoprimate

クラスX内では、MemberwiseCloneのインスタンスでのみX(またはその他の保護されたメソッド)を呼び出すことができます。 (またはXから派生したクラス)

クローンを作成しようとしているEnemyクラスは、クローンを作成しようとしているGameBaseクラスを継承しないため、このエラーが発生します。

これを修正するには、次のように、パブリックCloneメソッドをEnemyに追加します。

class Enemy : ICloneable {
    //...
    public Enemy Clone() { return (Enemy)this.MemberwiseClone(); }
    object ICloneable.Clone() { return Clone(); }
}
39
SLaks
  • memberwiseClone()を直接使用することはできません。派生クラスを介して実装する必要があります(推奨)
  • しかし、反射を介して、あなたはそれをだますことができます:)
  • 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;
    }
    
29
ModMa