c# - tipos - ¿Cómo puedo pasar una función con un parámetro de tipo genérico?
pasar tipo como parametro c# (4)
Necesitas hacer que SomeUtility
genérico también. Haciendo esto y arreglando la sintaxis da:
public void SomeUtility<T>(Func<object,T> converter)
{
var myType = converter("foo");
}
Me gusta enviar una función de conversión de tipo genérico a un método, pero no puedo averiguar cómo hacerlo.
Aquí hay una sintaxis no válida que explica lo que me gusta lograr, el problema es que no sé cómo especificar el tipo genérico junto con mi función:
public void SomeUtility(Func<T><object,T> converter)
{
var myType = converter<MyType>("foo");
}
Editar (vea también mi discusión en los comentarios con Lawrence): Por "convertidor de tipo genérico" quise decir que me gustaría pasar un convertidor que pueda convertir a cualquier tipo fuerte <T> (no objeto), por lo que la siguiente línea en mi El método podría ser:
var myOtherType = converter<MyOtherType>("foo");
El delegado que me gusta pasar como parámetro se vería así:
private delegate TOutput myConverterDelegate<TOutput>(object objectToConvert);
Esto es más una exploración de sintaxis / C # ahora, para hacer las cosas probablemente use una interfaz en su lugar, pero espero que esto sea posible con una función / delegado.
No puede tener instancias de funciones o acciones genéricas: todos los parámetros de tipo se definen por adelantado y el llamante no puede redefinirlos.
Una forma fácil sería evitar por completo el polimorfismo apoyándose en el castigo:
public void SomeUtility(Func<Type, object, object> converter)
{
var myType = (MyType)converter(typeof(MyType), "foo");
}
Si desea seguridad de tipo, debe aplazar la definición de los parámetros de tipo a la persona que llama. Puedes hacer esto componiendo un método genérico dentro de una interfaz:
public void SomeUtility(IConverter converter)
{
var myType = converter.Convert<MyType>("foo");
}
interface IConverter
{
T Convert<T>(object obj);
}
Editar:
Si el ''tipo de convertidor'' se conoce en el sitio de la llamada, y solo este tipo se usará dentro del método de utilidad, entonces puede definir un tipo genérico en el método y usarlo, tal como lo han sugerido otros carteles.
Tienes que saber el tipo T en tiempo de compilación para usarlo. La T puede especificarse a nivel de clase o a nivel de método.
class SomeClass<T> {
public void SomeUtility(Func<object, T> converter) {
var myType = converter("foo"); // Already is the T-type that you specified.
}
}
o
public void SomeUtility<T>(Func<object, T> converter) {
var myType = converter("foo"); // Already is the T-type that you specified.
}
public void SomeUtility<T>(Func<object, T> converter)
{
var myType = converter("foo");
}
y entonces:
SomeUtility(arg => new MyType());
La inferencia de tipo genérico funcionará en este caso.