2009-04-14 6 views
2

C#: Comment accepter un type de nombre dans une fonction en tant qu'argument? Actuellement, mon AddDataInt32() demande spécifiquement Int32, mais comment je peux accepter n'importe quel nombre, octet, ints signé ou non signé, donc je peux le passer à BitConverter.GetBytes()? Il est semble ridicule d'écrire même fonct est pour chaque type :(Comment accepter n'importe quel type de nombre dans une fonction en tant qu'argument en C#?

public void AddDataInt32(Int32 i) 
{ 
    Data = ConcatTwoByteArrays(Data, BitConverter.GetBytes(i)); 
} 
+0

Quel est le cas d'utilisation ici? Essayez-vous de rouler le code de sérialisation manuelle? Vous pourriez également envisager protobuf-net, qui pourrait vous faire gagner beaucoup de temps. –

Répondre

4

Vous pouvez simplement surcharger la méthode ...

public void AddData (Int32 i) 
{...} 

public void AddData (Int16 i) 
{...} 

etc. Un pour chaque type de numéro. Lorsque vous effectuez l'appel à la procédure, il prendra toute forme de numéro que vous avez codé, avec le même nom de procédure.

+0

+1 ... vous auriez à faire cela pour les 10 surcharges ... bâillement .. –

+0

Hey, c'est ce que MS a fait pour BitConverter, donc c'est probablement votre meilleur pari. – Brian

+0

Je sais que c'est un bâillement, mais c'est, imo, le meilleur moyen. –

2

Eh bien, vous pouvez automatiser avec la réflexion et génériques, mais l'OMI surcharge sont le meilleur choix -. Un peu comme votre code existant

Réflexion/génériques exemple - bien que je ne recommande pas vraiment cette route:

static void Main() 
{ 
    byte[] bytes = GetBytes(123); 
} 
static byte[] GetBytes<T>(T value) { 
    return Cache<T>.func(value); 
} 
static class Cache<T> { 
    public static readonly Func<T, byte[]> func; 
    static Cache() { 
     MethodInfo method = typeof(BitConverter) 
      .GetMethod("GetBytes", new Type[] { typeof(T) }); 
     if (method == null) { 
      func = delegate { throw new ArgumentException(
       "No GetBytes implementation for " + typeof(T).Name); }; 
     } else { 
      func = (Func<T, byte[]>)Delegate.CreateDelegate(
       typeof(Func<T, byte[]>), method); 
     } 
    } 
} 

Vous pouvez ensuite mélanger cela avec une méthode générique AddData<T> qui appelle GetBytes<T> etc.

+0

Belle réponse Marc, mais vous pourriez être en train de le surpasser? –

+0

Oh, absolument ;-p –

1
public void AddData(object data) 
{ 
} 

ou

public void AddData<T>(T data) 
{ 
} 

Bien que je pense que je préférerais les méthodes surchargées.

Questions connexes