Impossible d’accéder au membre protégé ‘object.MemberwiseClone ()’

J’essaie d’utiliser .MemberwiseClone() sur une classe personnalisée, mais cette erreur génère cette erreur:

 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) 

Qu’est-ce que ça veut dire? Ou mieux encore, comment puis-je cloner une classe Enemy ?

Dans toute classe X , vous pouvez uniquement appeler MemberwiseClone (ou toute autre méthode protégée) sur une instance de X (Ou une classe dérivée de X )

Étant donné que la classe Enemy que vous essayez de cloner n’hérite pas de la classe GameBase laquelle vous essayez de la cloner, vous obtenez cette erreur.

Pour résoudre ce problème, ajoutez une méthode de Clone publique à Enemy , comme ceci:

 class Enemy : ICloneable { //... public Enemy Clone() { return (Enemy)this.MemberwiseClone(); } object ICloneable.Clone() { return Clone(); } } 
  • vous ne pouvez pas utiliser MemberwiseClone () directement, vous devez l’implémenter via une classe dérivée (recommandé)
  • mais, par reflection, vous pouvez le tromper 🙂
  • vous pouvez utiliser cette extension pour les classes qui n’implémentent pas 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; } 

voici une méthode d’extension qui permet le clonage de n’importe quel object (à utiliser avec l’avertissement qu’il ne fonctionne pas dans tous les cas)

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