c# – 流畅的API的类型推断

我有以下扩展方法:

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);

通用接口总是从其相应的非通用接口派生出来.

不幸的是,要做到这一点:

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 => ...);
翻译自:https://stackoverflow.com/questions/17842553/type-inference-for-fluent-api

转载注明原文:c# – 流畅的API的类型推断