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:看起来不错,但我认为作为一种扩展方法,没有办法做到这一点?