2010-10-23 134 views
12

我有这样的(简化版本)的通用方法:偏类型推断

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

在上文中,param是故意object类型。这是要求的一部分。

当我填写的类型,我可以这样调用:

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

不过,我想使用类型推断。最好我想写这个:

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

但是这不能编译。我想出的最好的是这样的:

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

我想有这样一个类型参数,仍然有正确类型的返回类型,因为我的实际调用看起来像这样的理由:

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

这是非常丑陋的,我很想写的是这样的:

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

.NET类型推断是全部或全部 - 绝不是部分的。 – Dario 2010-10-23 10:42:53

+0

重写该方法的任何想法仍然会摆脱“p”参数的丑陋输入? – 2010-10-23 10:44:11

+0

@Dario这是一个过度泛化。类型推断是C#功能,其他.net语言可能会以不同的方式处理它。 – CodesInChaos 2011-07-23 20:36:30

回答

15

您可以T分割成一个通用的方法对泛型类型:

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

这里int是推断出来,但字符串是明确的。

+0

谢谢,就是这样。 – 2010-10-23 11:46:16

3

什么你正在努力实现是不可能的。如果推论是可能的,你需要指定泛型参数或者它们中的任何一个。

+0

重写该方法的任何想法仍然会摆脱“p”参数的丑陋输入? – 2010-10-23 10:45:48

+0

我认为你有的最后一个版本不是很糟糕:你只需要一个额外的返回类型的泛型参数。 – 2010-10-23 10:48:44

+0

这就是整个观点。类型在那里,'GetAllForTruckSchedule'有一个返回类型,我不想指定它。该方法用于例如在Linq的查询中,我想推理尽可能地工作。 'var'一路:)。 – 2010-10-23 10:52:15