gpt4 book ai didi

generics - 泛型类型的扩展方法,带有额外的泛型类型参数

转载 作者:行者123 更新时间:2023-11-30 23:54:56 25 4
gpt4 key购买 nike

我想为泛型类型编写一个扩展方法,并带有额外的泛型类型参数。我已经有工作代码,但不喜欢结果,因为要求用户重新输入现有类型的泛型类型参数。

我有一个具体的例子,但请记住,这是一个普遍的问题。我感谢手头的特定问题的反馈,但我正在寻找通用的解决方案。

对于一类类型 Action<T> , 添加一个具有类似于此签名的扩展方法:

Func<T, TResult> ToFunc<TResult>();

这是我的工作代码:
public static class DelegateExtensions
{
public static Func<T, TResult> ToFunc<T, TResult>(this Action<T> action)
{
return arg => { action(arg); return default(TResult); };
}
}

但用法很臭:
public void TakesAFunc(Func<int, float> someFunc) { /* ... */ }
// ...
Action<int> someIntAction = /* ... */;
TakesAFunc(someIntAction.ToFunc<int, float>());

在本例中, int泛型参数是唯一可接受的值,因此会导致不必要的代码重复。

类型推断在这里不起作用。我认为这是因为您无法通过返回类型推断泛型参数。

这段代码可以解决问题,但不幸的是似乎不起作用:
public static class DelegateExtensions<T>
{
public static Func<T, TResult> ToFunc<TResult>(this Action<T> action)
{
return arg => { action(arg); return default(TResult); };
}
}

用法与您期望的完全一样:
public void TakesAFunc(Func<int, float> someFunc) { /* ... */ }
// ...
Action<int> someIntAction = /* ... */;
TakesAFunc(someIntAction.ToFunc<float>());

我注意到 System.Linq.Queryable以我的第一段代码的方式工作,尽管它通常不需要额外的类型参数,因此类型推断有效。

是否有任何已知的技巧可以绕过要求这些重复的泛型类型参数?我想到的一个想法是代码生成器或某种宏,但我想不出如何干净利落地做到这一点。

最佳答案

这种事情的一个常见技巧是传递所需类型的虚拟值,仅用于类型推断,这在涉及匿名类型的某些场景中是必需的。

public static class DelegateExtensions
{
public static Func<T, TResult>
ToFunc<T, TResult>(this Action<T> action, TResult ignored)
{
return arg => { action(arg); return default(TResult); };
}
}

这是一个多么好的技巧取决于个人意见,但是每次我调用它以及每次我回到我调用它的地方时,这都会使我感到困惑。您还可以更改方法的语义,使第二个参数成为返回值,从而允许调用者决定是否需要默认值。

至于你的第二个例子,我很确定泛型类型不允许使用扩展方法,但我没有方便的链接

关于generics - 泛型类型的扩展方法,带有额外的泛型类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4456609/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com