2009-04-13 19 views

Respuesta

26

Tendría que usar medicamentos genéricos para esto. Por ejemplo,

protected T Test<T>(T parameter) 
{ 

} 

En este ejemplo, el '<T>' le dice al compilador que representa el nombre de un tipo, pero no saben lo que es en el contexto de la creación de esta función. Así que terminarías llamándolo como ...

int foo; 

int bar = Test<int>(foo); 
1

Luego hay que utilizar los genéricos.

protected T Test(T type) { 

return type; 

} 
+0

@Shiko, en realidad, si nos fijamos en la marca de tiempo, esto se produjo antes de la respuesta de Adán. – uchamp

+0

@uchamp mi mal, voy a eliminar mi comentario – Shiko

5

En realidad, asumiendo que tiene un conjunto conocido de parámetros y tipos de devolución, que podría ser manejado con una simple sobrecarga:

protected int Test(string p) { ... } 
protected string Test(DateTime p) { .... } 
+0

El problema aquí es qué pasa si la persona que llama no sabe el tipo antes de llamar. Por ejemplo, solo uno de cadena o int es válido no ambos. – rolls

+0

@rolls - Por supuesto que sí. Está pasando una variable (o constante) de un cierto tipo al método. Está poniendo el valor de retorno en una variable de cierto tipo. Él claramente quiere usar el mismo método en diferentes lugares con diferentes tipos. –

+0

Sí en este ejemplo. Estaba hablando más en general. – rolls

1

C# no es un lenguaje dinámico Para abordar este problema en C#, puede devolver un objeto genérico y encasillarlo más tarde a lo que crea que debería ser el valor, no recomendado. También puede devolver una interfaz, de esta manera no le importa una instancia de clase específica. Como otros han señalado, también puedes usar genéricos. Realmente depende de lo que necesita/desea hacer dentro del cuerpo de la función ya que todos los métodos anteriores tienen sus propias limitaciones.

+4

C# ahora es dinámico si quieres que lo sea. Use el tipo "dinámico". –

13

Mientras que la respuesta aceptada es bueno, han pasado más de dos años desde que fue escrito, por lo que, debo añadir que se puede utilizar:

protected dynamic methodname(dynamic input) 
{ 
    return input; 
} 

entrada será devuelto como el mismo tipo, y usted no es necesario llamar al método como genérico.

Referencia:
https://msdn.microsoft.com/en-us/library/dd264736.aspx

+4

También vale la pena señalar que la respuesta aceptada también puede utilizar la inferencia de tipo genérico, lo que le permite llamarlo como 'Test (foo)' y no tener que especificar explícitamente el argumento genérico. –

+0

@AdamRobinson Gracias ... Los genéricos no son mi punto fuerte (por ahora) y sigo aprendiendo - iba a escribir una pregunta acerca de las funciones dinámicas y vieron esto en la lista sugerida ... Sólo aunque debo añadir que! – Wil

+0

gracias a ambos por la entrada, cada uno tiene su propio uso es como veo – DevMania