2009-05-20 8 views
1

Je lis ce code sample:Base64ToHex() sur exemple de code

Et comme je ne sais pas C#, j'ai décidé de lui donner un coup.

Lors de la compilation que je l'ai reçu ce message:

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 

J'ai regarder dans MSDN et comme prévu, je n'ai pas trouvé une référence pour cette méthode.

Question: D'où vient cette méthode?

p.s. Mon code ressemble:

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

Cet appel de méthode est dans le code de quelque chose que vous lisez? – CSharpAtl

+0

Ils pourraient avoir une référence à une bibliothèque qu'ils ont écrit une méthode d'extension appelée Base64ToHex() – CSharpAtl

+0

@CSharpAlt: Oui, le lien est dans la publication. Il se trouve dans le deuxième segment de code: Debug.WriteLine ( Crypter ("essayer un autre" + "00000000000000000000000000000000", clé, true) .Base64ToHex()); – OscarRyz

Répondre

1

Si ce code jamais respecté, Jeff avait probablement une méthode d'extension sur chaîne appelée "Base64ToHex". Extension methods vous permettent de définir des méthodes pour « étendre » d'autres classes, de telle sorte qu'il semble que la méthode a été effectivement défini dans cette classe:

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

C'est plus probable. Je ne connaissais pas les méthodes d'extensions. Ils pourraient être ajoutés seulement aux classes non-finales je suppose, et je suppose que la chaîne est non finale, ai-je raison? Qu'est-ce qui est avec le modificateur d'accès "statique"? Est-ce nécessaire? Que signifie une classe statique? – OscarRyz

+0

La classe String est scellée (le modificateur d'accès "final" est Java.). C'est ce qui est intéressant avec les méthodes d'extension - elles vous permettent d'étendre des classes "non extensibles". La méthode doit être statique, mais la classe n'a pas besoin d'être. Une classe statique est une classe qui ne peut pas être instanciée (de sorte que vous n'êtes pas tenté de le faire, accidentellement). –

+0

Pour amplifier, vous pouvez déclarer une méthode d'extension où vous voulez, tant que vous référencez la classe contenant (avec une instruction using) lorsque vous appelez la méthode. J'aime regrouper mes méthodes d'extension (je n'en ai pas beaucoup) par fonction, et pas seulement les mettre bon gré mal gré. –

1

Il n'y a pas de méthode Base64ToHex dans System.String. Je pense que vous êtes à la recherche Convert.FromBase64String et BitConverter.ToString:

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

Je pris un regard sur votre lien, et je suppose qu'il a écrit une méthode d'extension d'aide qui fait la même chose:

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