17


2

保護されたメンバー '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)

これは何を意味するのでしょうか? それとも、「敵」クラスのクローンを作成するにはどうすればよいですか?

3 Answer


33


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

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

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

class Enemy : ICloneable {
    //...
    public Enemy Clone() { return (Enemy)this.MemberwiseClone(); }
    object ICloneable.Clone() { return Clone(); }
}


25


  • MemberwiseClone()を直接使用することはできません。次の方法で実装する必要があります 派生クラス(推奨)

  • しかし、反射を介して、それをだますことができます:)

  • あなたは実装していないクラスにこの小さな拡張機能を使用できます ICloneable:+

///
/// Clones a object via shallow copy
///
/// Object Type to Clone
/// Object to Clone
/// New Object reference
public static T CloneObject(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;
}


-1


ここに、任意のオブジェクトのクローンを作成できる拡張メソッドがあります(すべての場合に機能しないことに注意して使用してください)

public static class Extra_Objects_ExtensionMethods
{
    public static T clone(this T objectToClone)
    {
        try
        {
            if (objectToClone.isNull())
                "[object.clone] provided object was null (type = {0})".error(typeof(T));
            else
                return (T)objectToClone.invoke("MemberwiseClone");
        }
        catch(Exception ex)
        {
            "[object.clone]Faild to clone object {0} of type {1}".error(objectToClone.str(), typeof(T));
        }
        return default(T);
    }
}