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