2010-01-07 6 views
13

Ich versuche .MemberwiseClone() auf einer benutzerdefinierten Klasse von mir zu verwenden, aber es diesen Fehler wirft:Kein Zugriff auf geschützte Mitglieder object.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) 

Was bedeutet das? Oder noch besser, wie kann ich eine Enemy Klasse klonen?

Antwort

28

Innerhalb einer Klasse X können Sie nur MemberwiseClone (oder eine andere geschützte Methode) auf einer Instanz von X aufrufen. (Oder eine Klasse abgeleitet von X)

Da die Enemy Klasse, die Sie zu klonen sind versucht, nicht erben die GameBase Klasse, die Sie versuchen, es zu klonen in, werden Sie diesen Fehler.

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

Aber ich dachte MemberwiseClone ein Verfahren zum Gegenstand war, die afaik werden alle Klassen abgeleitet? – Xenoprimate

+4

Ja, aber Sie können die geschützte Methode einer anderen Klasse nur aufrufen, wenn sie von _you_ erbt. Andernfalls könnten Sie jedes geschützte Mitglied (einschließlich "MemberwiseClone") für jede Klasse aufrufen, indem Sie einfach von dieser Klasse erben. Dies würde "geschützt" fast nutzlos machen. – SLaks

+0

"protected" ist eine andere Art zu sagen: Nur die Klasse selbst weiß, wann MemberwiseClone() das Richtige ist. Es ist selten, Google "tiefe Kopie". –

25
  • kann man auch nichts nutzen MemberwiseClone() direkt, müssen Sie es über abgeleitete Klasse implementieren (empfohlen)
  • :

    Um dies zu beheben, eine öffentliche Clone Methode Enemy, wie folgen hinzufügen

  • sondern durch Reflexion, können Sie es betrügen :)
  • Sie diese litle Erweiterung für die Klassen verwenden können, die nicht ICloneable implementieren:

+3

Ich kann nicht verstehen, warum MemberwiseClone nicht öffentlich ist ... Und der obige "Cheat" ist sehr nützlich! Daumen hoch! – Shaamaan

+0

In Silverlight, ich habe 'System.MethodAccessException wurde von Benutzercode nicht behandelt: Message = Versuch durch Methode 'ExtensionStaticClass.MemberwiseCloneEx (System .__ Canon)', um auf Methode 'System.Object.MemberwiseClone()' fehlgeschlagen ' –

+0

In Silverlight kann die Reflektion für private Mitglieder nicht für Sicherheit verwendet werden, begrenzt durch Microsoft, können Sie WCF-Serialisierung für Klon – ModMa

0

hier ist eine Erweiterung Methode, die das Klonen eines Objekts einstellen (mit dem Vorbehalt, dass es nicht in allen Fällen funktioniert) ermöglicht

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