私のカスタムクラスで.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
クラスのクローンを作成できますか?
クラスX
内では、MemberwiseClone
のインスタンスでのみX
(またはその他の保護されたメソッド)を呼び出すことができます。 (またはX
から派生したクラス)
クローンを作成しようとしているEnemy
クラスは、クローンを作成しようとしているGameBase
クラスを継承しないため、このエラーが発生します。
これを修正するには、次のように、パブリックClone
メソッドをEnemy
に追加します。
class Enemy : ICloneable {
//...
public Enemy Clone() { return (Enemy)this.MemberwiseClone(); }
object ICloneable.Clone() { return Clone(); }
}
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;
}