2009-05-20 7 views
1

Ich lese diesen Code sample:Base64ToHex() auf Codebeispiel

Und da ich nicht weiß, C#, habe ich beschlossen, es gehen zu geben.

Beim Kompilieren ich diese Nachricht erhalten haben:

Main.cs(32,65): error CS1061: Type `string' does not contain a definition for `Base64ToHex' and no extension method `Base64ToHex' of type `string' could be found (are you missing a using directive or an assembly reference?) 
Compilation failed: 1 error(s), 0 warnings 

Ich habe Blick in MSDN und ich habe nicht erwartet, eine Referenz für diese Methode finden.

Frage: Woher kam diese Methode?

p.s. Mein Code sieht so aus:

using System.Security.Cryptography; 
using System.Text; 
using System; 

class MainClass 
{ 
    public static string Encrypt(string toEncrypt, string key, bool useHashing) 
    { 
     ..... // same as in post 
     ..... 
    } 

    public static void Main(string [] args) 
    { 
     string key = "secret"; 

     Console.WriteLine(Encrypt("oscar" + "000", key, true).Base64ToHex()); 
    } 

}

+0

Dieser Methodenaufruf steht im Code von etwas, das Sie gerade lesen? – CSharpAtl

+0

Sie könnten einen Verweis auf eine Bibliothek haben, dass sie eine Erweiterung Methode namens Base64ToHex() geschrieben – CSharpAtl

+0

@CSharpAlt: Ja, der Link ist in der Post. Es ist in der zweiten Code-Segment: Debug.WriteLine ( Verschlüsseln ("versuchen Sie einige verschiedene" + "00000000000000000000000000000000", Schlüssel, wahr). Base64ToHex()); – OscarRyz

Antwort

1

Wenn dieser Code jemals erfüllt, Jeff wahrscheinlich eine Erweiterungsmethode auf String hatte "Base64ToHex" genannt. Extension methods können Ihnen Methoden definieren andere Klassen zu „erweitern“, so dass es scheint, dass das Verfahren tatsächlich in dieser Klasse definiert wurde:

public static class ExtensionMethods 
{ 
    public static string Base64ToHex(this string str) 
    { 
     return ...; 
    } 
} 
+0

Dies ist wahrscheinlicher. Ich wusste nicht über Erweiterungsmethoden. Sie könnten nur zu nicht-finalen Klassen hinzugefügt werden, denke ich, und ich denke, String ist nicht endgültig, habe ich recht? Was ist mit dem "statischen" Zugriffsmodifizierer? Wird es benötigt? Was bedeutet eine statische Klasse? – OscarRyz

+0

Die String-Klasse ist versiegelt (Der "letzte" Zugriffsmodifikator ist Java. Das Gleiche.). Das ist das Schöne an Extension-Methoden - sie ermöglichen es Ihnen, "nicht erweiterbare" Klassen zu erweitern. Die Methode muss statisch sein, aber die Klasse muss nicht sein. Eine statische Klasse ist eine Instanz, die nicht instanziiert werden kann (so dass Sie nicht versucht werden, dies versehentlich zu tun). –

+0

Um zu erweitern, können Sie eine Erweiterungsmethode an beliebiger Stelle deklarieren, solange Sie die aufrufende Klasse (mit einer using-Anweisung) beim Aufruf der Methode referenzieren. Ich gruppiere meine Erweiterungsmethoden (ich habe nicht viele) nach der Funktion, und lege sie nicht einfach so ab. –

1

Es gibt keine Base64ToHex Methode in System.String. Ich glaube, Sie suchen Convert.FromBase64String und BitConverter.ToString:

string encrypted = Encrypt("oscar" + "000", key, true); 
Console.WriteLine(BitConverter.ToString(Convert.FromBase64String(encrypted))); 

Ich habe einen Blick auf Ihren Link, und ich vermute er einen Helfer-Extension-Methode geschrieben, die das gleiche tut:

public static string Base64ToHex(this string s) 
{ 
    return BitConverter.ToString(Convert.FromBase64String(s)); 
} 
Verwandte Themen