我有以下扩展方法:
public static IFoo Foo(this IFluentApi api, Action action);
public static IFoo<TResult> Foo<TResult>(
this IFluentApi api, Func<TResult> func);
public static IBar Bar(this IFoo foo);
public static void FooBar(this IBar bar, Action action);
public static void FooBar<TResult>( // <- this one cannot work as desired
this IBar bar, Action<TResult> action);
通用接口(interface)总是派生自它们对应的非通用接口(interface)。
不幸的是,要完成这项工作:
api.Foo(x => ReturnLong())
.Bar()
.FooBar(x => ...); // x should be of type long
我还需要实现以下扩展方法:
public static IBar<TResult> Bar<TResult> (this IFoo<TResult> foo);
并将上述扩展方法的最后一个更改为:
public static void FooBar<TResult>(
this IBar<TResult> bar, Action<TResult> action);
实际上,我不仅在 Foo()
和 FooBar()
之间有 Bar()
,而且还有很长的方法链有巨大的额外实现成本。
有什么方法可以避免这个问题并“神奇地”转发TResult
泛型参数吗?
编辑:
不会丢失类型推断!
最佳答案
假设您可以从 IFoo<TResult>
开始到IFoo
并且您的方法链不关心 TResult
您可以通过将用法更改为类似以下内容来节省一些实现:
api.Foo(x => ReturnLong())
.Bars(foo=>foo.Bar1() //where foo is an IFoo
.Bar2()
.Bar3()
...
)
.FooBar(x => ...);
关于c# - Fluent API 的类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17842553/