2009-11-14 17 views
8

Quiero crear una función genérica sencillaC#: Cómo utilizar el método genérico con "fuera" variable de

void Assign<T>(out T result) 
{ 
    Type type = typeof(T); 
    if (type.Name == "String") 
    { 
    // result = "hello"; 
    } 
    else if (type.Name == "Int32") 
    { 
    // result = 100; 
    } 
    else result = default(T); 
} 

Uso:

int value; 
string text; 

Assign(value); // <<< should set value to 100 
Assign(text); // <<< should set text to "hello" 

Mi pregunta es ¿cómo se programa el código para establecer estos valores, es decir. los códigos faltantes en la sección de comentarios.

Gracias por cualquier ayuda.

Respuesta

16

Parece que en este caso tal vez lo está haciendo para tratar de evitar el boxeo? Es difícil de decir sin más información, pero para este ejemplo específico, que sería mucho más fácil y probablemente menos propensos a error sólo tiene que utilizar la sobrecarga de métodos:

void Assign(out string value) 
{ 
    //... 
} 

void Assign(out int value) 
{ 
    //... 
} 

A los efectos de aprendizaje específicamente lo es mal aquí , sí es necesario para convertir un valor de un objeto antes de lanzarlo al tipo genérico:

(T)(object)"hello world!"; 

Qué OMI es bastante desagradable y debe ser el último recurso - ciertamente no hacer que el código más limpio.

Cada vez que hace una comprobación de tipo de parámetros genéricos, es una buena indicación de que los genéricos no son la solución adecuada para su problema. Hacer verificaciones genéricas del tipo de parámetro hace que su código sea más complejo, no más simple. Hace que un método sea responsable de diferentes comportamientos basados ​​en el tipo, en lugar de una serie de métodos únicos que son fáciles de cambiar sin afectar accidentalmente a los demás. Ver Single Responsibility Principle.

0

Aquí es una manera:

static void Assign<T>(out T result) { 
    Type type = typeof(T); 
    if (type.Name == "String") { 
     result = (T)Convert.ChangeType("hello", typeof(T)); 
    } 
    else if (type.Name == "Int32") { 
     result = (T)Convert.ChangeType(100, typeof(T)); 
    } 
    else { 
     result = default(T); 
    } 
} 

Pero este código huele muy mal y va en contra del punto de genéricos (en lugar de utilizar métodos sobrecargados). Espero que esto no termine en el código de producción en alguna parte y sea solo para edificación.

+0

Muchas gracias; esto funciona. La razón por la que estoy usando un enfoque genérico es para simplificar mi código. Porque el "código de asignación" solo es necesario para un tipo específico (por ejemplo, una cadena); sería malo crear funciones sobrecargadas para todos los tipos posibles. resultado = predeterminado (T) // es el comportamiento común –

+7

No estoy de acuerdo con usted. Creo que la sobrecarga es exactamente por eso. Use medicamentos genéricos solo cuando sea necesario. – Sheldon

3

Primero que nada, es un patrón muy malo. No deberías usar este tipo de patrón. Tal vez si describes lo que realmente quieres lograr habrá mejores respuestas.

El siguiente código funciona, pero como dije escribir código de esta manera es una mala idea.

void Assign<T>(out T result) 
    { 
     Type type = typeof(T); 
     if (type.Name == "String") 
     { result = (T) ((object)"hello"); } 
     else if (type.Name == "Int32") 
     { result = (T) ((object)100); } 
     else result = default(T); 
    } 

y uso:

 int value; 
     string text; 

     Assign(out value); 
     Assign(out text); 
1
public T GetObject<T>(string val) 
{ 
    T _object = default(T); 
    _object = (T)Convert.ChangeType(val, typeof(T)); 
    return _object; 
} 
Cuestiones relacionadas