2010-10-23 29 views
12

Tengo un método genérico como esta (versión simplificada):tipo parcial inferencia

public static TResult PartialInference<T, TResult>(Func<T, TResult> action, object param) 
{ 
    return action((T)param); 
} 

En lo anterior, param es de tipo object a propósito. Esto es parte del requisito.

Cuando relleno en los tipos, puedo llamarlo así:

var test1 = PartialInference<string, bool>(
    p => p.EndsWith("!"), "Hello world!" 
); 

Sin embargo, me gustaría utilizar la inferencia de tipos. Preferiblemente, me gustaría escribir esto:

var test2 = PartialInference<string>(
    p => p.EndsWith("!"), "Hello world!" 
); 

Pero esto no se compila. Lo mejor que se me ocurrió es la siguiente:

var test3 = PartialInference(
    (string p) => p.EndsWith("!"), "Hello world!" 
); 

La razón me gustaría tener esto como un parámetro de tipo y todavía tienen el tipo de retorno correctamente escrito se debe a mis llamadas reales sean algo como esto:

var list1 = ComponentProvider.Perform(
    (ITruckSchedule_StaffRepository p) => p.GetAllForTruckSchedule(this) 
) 

que es muy feo y me encanta escribir como algo parecido a esto:

var list2 = ComponentProvider.Perform<ITruckSchedule_StaffRepository>(
    p => p.GetAllForTruckSchedule(this) 
) 
+2

. Inferencia tipo .NET es todo o nada, nunca parcial. – Dario

+0

¿Alguna idea para una reescritura del método que aún así eliminaría la fea tipeación del parámetro 'p'? –

+0

@Dario eso es una generalización excesiva. La inferencia de tipo es una característica C# y otros lenguajes .NET pueden manejarlo de manera diferente. – CodesInChaos

Respuesta

15

Se puede dividir t en un método genérico de un tipo genérico:

class Foo<TOuter> { 
    public static void Bar<TInner>(TInner arg) {...} 
} 
... 
int x = 1; 
Foo<string>.Bar(x); 

Aquí el int es inferida pero la cadena es explícito.

+0

Gracias, eso es todo. –

3

lo que estamos tratando de lograr no es posible. Debe especificar ambos argumentos genéricos o ninguno de ellos si la inferencia es posible.

+0

¿Alguna idea para una reescritura del método que aún así eliminaría la fea tipeación del parámetro 'p'? –

+0

Creo que la última versión que tuvo no es tan mala: solo necesita un parámetro genérico adicional para el tipo de devolución. –

+0

Ese es el punto. El tipo está ahí, el 'GetAllForTruckSchedule' tiene un tipo de devolución, y no quiero especificar esto. Este método se usa, p. en las consultas de Linq y me gustaría hacer una inferencia sobre el trabajo tanto como sea posible. 'var' todo el camino :). –

Cuestiones relacionadas