2010-10-23 13 views
12

Ich habe eine generische Methode wie diese (vereinfachte Version):Teil Typinferenz

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

In dem obigen ist param vom Typ object absichtlich. Dies ist Teil der Anforderung.

Wenn ich in der Art füllen, kann ich es so nennen:

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

aber ich möchte Typinferenz verwenden. Vorzugsweise möchte ich folgendes schreiben:

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

Aber das kompiliert nicht. Das Beste, was ich kam mit, ist dies:

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

Der Grund Ich mag würde dies als Typ-Parameter haben, und haben immer noch die richtig eingegeben Rückgabetyp ist, weil meine tatsächlichen Anrufe wie folgt aussehen:

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

die sehr hässlich ist, und ich würde so etwas zu schreiben liebe:

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

.NET-Typ-Inferenz ist alles oder nichts - niemals partiell. – Dario

+0

Irgendwelche Ideen für eine Neuschreibung der Methode, die noch die hässliche Typisierung des 'p' Parameters loswerden würde? –

+0

@Dario das ist eine Über-Generalisierung. Typinferenz ist ein C# -Feature und andere .net-Sprachen können es anders behandeln. – CodesInChaos

Antwort

15

Sie können t in eine generische Methode auf einem generischen Typ aufgeteilt:

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

Hier ist der int abgeleitet ist, aber der String ist eindeutig.

+0

Danke, das war's. –

3

Was Sie versuchen zu erreichen ist nicht möglich. Sie müssen beide generischen Argumente oder keine der Argumente angeben, wenn Rückschlüsse möglich sind.

+0

Irgendwelche Ideen für eine Neuschreibung der Methode, die noch die hässliche Typisierung des 'p' Parameters loswerden würde? –

+0

Ich denke, die letzte Version, die Sie hatten, ist nicht so schlecht: Sie brauchen nur einen zusätzlichen generischen Parameter für den Rückgabetyp. –

+0

Das ist der springende Punkt. Der Typ ist da, der 'GetAllForTruckSchedule' hat einen Rückgabetyp, und ich möchte dies nicht spezifizieren. Diese Methode wird z.B. in Linq-Abfragen und ich möchte schließen lassen, dass es so viel Arbeit wie möglich ist. 'var' den ganzen Weg :). –