Не удается получить доступ к объекту защищенного члена .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?

Ответы

Ответ 1

В любом классе X вы можете вызвать MemberwiseClone (или любой другой защищенный метод) в экземпляре X. (Или класс, полученный из X)

Поскольку класс Enemy, который вы пытаетесь клонировать, не наследует класс GameBase, который вы пытаетесь клонировать, вы получаете эту ошибку.

Чтобы исправить это, добавьте общедоступный метод Clone в Enemy, например:

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

Ответ 2

  • вы не можете напрямую использовать элемент 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;
    }
    

Ответ 3

здесь - метод расширения, который позволяет клонировать любой объект (использовать с оговоркой, что он не работает во всех случаях)

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