Невозможно получить доступ к защищенному члену object.MemberwiseClone () - PullRequest
20 голосов
/ 07 января 2010

Я пытаюсь использовать .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 класс?

Ответы [ 3 ]

36 голосов
/ 07 января 2010

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

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

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

class Enemy : ICloneable {
    //...
    public Enemy Clone() { return (Enemy)this.MemberwiseClone(); }
    object ICloneable.Clone() { return Clone(); }
}
27 голосов
/ 02 февраля 2011
  • вы не можете использовать 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;
    }
    
0 голосов
/ 12 мая 2013

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

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);
    }   
}
...