C# 部分类型推断

C# 部分类型推断,c#,generics,C#,Generics,我有一个通用方法,类似于这个简化版本: public static TResult PartialInference<T, TResult>(Func<T, TResult> action, object param) { return action((T)param); } 但是,我想使用类型推断。我最好写下以下内容: var test2 = PartialInference<string>( p => p.EndsWith("!")

我有一个通用方法,类似于这个简化版本:

public static TResult PartialInference<T, TResult>(Func<T, TResult> action, object param)
{
    return action((T)param);
}
但是,我想使用类型推断。我最好写下以下内容:

var test2 = PartialInference<string>(
    p => p.EndsWith("!"), "Hello world!"
);
我希望将其作为类型参数并仍然具有正确类型的返回类型的原因是,我的实际调用如下所示:

var test1 = PartialInference<string, bool>(
    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)
)
这很难看,我很想这样写:

var test1 = PartialInference<string, bool>(
    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)
)

你想要达到的目标是不可能的。若可以推断,您需要同时指定两个泛型参数,或者不指定任何泛型参数。

您可以将t拆分为泛型类型上的泛型方法:

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

这里,int是推断的,但字符串是显式的。

您可以使用反射。。。像下面这样

下面是一个如何使用两个泛型参数调用扩展方法的示例

我们必须找到执行扩展方法的方法:

直接来自抽象基类的 b从从该基类派生的实例对象

这样的实现不是强制性的,但我发现它非常方便

a您必须像往常一样提供两个通用参数。 b因为您正在使用实例,所以您已经有一个泛型类型。另一个泛型参数必须作为类型参数进行传递,由于不明确,您无法向其传递第二个泛型参数


.NET类型推断要么全是,要么什么都不是——绝不是局部的。有没有想法重写该方法,以摆脱p参数的丑陋类型?@Dario这是一个过度概括。类型推断是C语言的一项功能,其他.net语言可能会以不同的方式处理它。@CodeInChaos:完全正确,对不起。以上内容至少适用于C和VB.NET。有没有重写该方法的想法,仍然可以摆脱p参数的难看类型?我认为您的上一个版本没有那么糟糕:您只需要为返回类型添加一个额外的泛型参数。这就是重点。类型在那里,GetAllForTruckSchedule有一个返回类型,我不想指定它。例如,在Linq查询中使用这种方法,我希望推理尽可能多地完成它的工作。var:看起来不错,但我认为作为一种扩展方法,没有办法做到这一点?