如何传入带有泛型类型参数的 func?

2024-04-12

我喜欢向方法发送通用类型转换器函数,但我不知道该怎么做。

这是无效的语法,解释了我想要实现的目标,问题是我不知道如何与我的 func 一起指定泛型类型:

public void SomeUtility(Func<T><object,T> converter)
{
    var myType = converter<MyType>("foo");
}

编辑(另请参阅我在评论中与劳伦斯的讨论):通过“通用类型转换器”,我的意思是我想传递一个可以转换为任何强类型 (不是对象)的转换器,所以我的下一行方法可以是:

var myOtherType = converter<MyOtherType>("foo");

我喜欢作为参数传递的委托看起来像这样:

private delegate TOutput myConverterDelegate<TOutput>(object objectToConvert);

现在这更多的是语法/C# 探索,为了完成任务,我可能会使用接口,但我确实希望这可以通过 func/delegate 来完成。


您不能拥有泛型函数或操作的实例 - 所有类型参数都是预先定义的,并且不能由调用者重新定义。

一个简单的方法是通过向下转型来完全避免多态性:

public void SomeUtility(Func<Type, object, object> converter)
{
    var myType = (MyType)converter(typeof(MyType), "foo");
}

如果你想要类型安全,你需要将类型参数的定义推迟给调用者。您可以通过在接口中编写通用方法来实现此目的:

public void SomeUtility(IConverter converter)
{
    var myType = converter.Convert<MyType>("foo");
}

interface IConverter
{
   T Convert<T>(object obj);
}

Edit:

如果“转换器类型”在调用站点已知,并且只有此类型将在实用程序方法内使用,那么您可以在该方法上定义通用类型并使用它,就像其他海报所建议的那样。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何传入带有泛型类型参数的 func? 的相关文章

随机推荐