2010-01-27 2 views
2

Fondamentalement ce que je voudrais générer est d'autres valeurs aléatoires qui n'ont pas la même valeur de la valeur donnée.Comment puis-je implémenter une classe de propriété d'extension pour les types primitifs de manière propre?

Je n'arrive pas à obtenir les types primitifs d'une manière agréable.

Les types primitifs sont les suivants: Booléen, Octet, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64, IntPtr, UIntPtr, Char, Double et Single.

Voici essentiellement ce que j'essaie de faire.

int oldValue = 1; 
    oldValue.Other(); // 2 

    long oldValue = 1; 
    oldValue.Other(); // 2 

    string oldValue = "1"; 
    oldValue.Other(); "5" 

Est-ce que quelqu'un a suggéré comment je pourrais m'y prendre?

Répondre

4

Il existe une classe de base appelée ValueType. Le problème est que vous devez convertir la valeur en enfant lorsque vous l'utilisez.

par exemple

int a =3; 
int b = (int)a.abc(); 

regard d'extension comme suit

public static class ValueTypeExtension 
{ 
    public static ValueType abc(this ValueType a) { 

     return default(ValueType); 
    } 
} 

vous devez effectuer une vérification de type sur le paramètre 'a' si elseif pour revenir correctement la valeur que vous avez l'intention.

par exemple

if(a is Int32) 
     return 4; 

Mise à jour: string est pas exactement un type de valeur, mais son traité comme un. Vous devez toujours gérer la chaîne dans une méthode d'extension séparée.

0

Selon votre question, vous voulez traiter les types primitifs comme des types de référence, ce qui n'est pas possible (uniquement via le mot-clé ref). Pour que cela soit clair, considérer les points suivants:

int DoSomething(int n) 
{ 
    n = 5; 
    return n; 
} 

int a = 3; 
DoSomething(a); // a is still 3 
a = DoSomething(a); // a is now 5 

Par conséquent, cela ne fonctionnera pas comme prévu:

int oldValue = 1; 
oldValue.Other(); // oldValue won't change 

mais cela:

int oldValue = 1; 
oldValue = oldValue.Other(); 
0

Pour les types de valeur ce ne sera pas travail. Vous devrez réaffecter la nouvelle valeur à la variable. Par exemple:

int oldValue = 1;

oldvalue = ancienneValeur.Autre(); // 2

long oldValue = 1;

oldvalue = ancienneValeur.Autre(); // 2

string oldValue = "1";

oldvalue = ancienneValeur.Autre(); « 5 »

Vous devrez le faire à la chaîne trop même si elles sont de type de référence car ils sont immuables (il n'y a aucun moyen de changer une chaîne en place sans utiliser hacks pointeur dangereux)

Questions connexes