gpt4 book ai didi

c# - 如何传入具有泛型类型参数的函数?

转载 作者:IT王子 更新时间:2023-10-29 04:09:28 25 4
gpt4 key购买 nike

我想将泛型类型转换器函数发送到一个方法,但我不知道该怎么做。

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

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

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

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

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

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

现在这更像是一种语法/C# 探索,为了完成任务,我可能会改用接口(interface),但我确实希望这可以通过 func/delegate 来完成。

最佳答案

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

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

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

如果你想要类型安全,你需要将类型参数的定义推迟到调用者。您可以通过在接口(interface)中组合一个通用方法来做到这一点:

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

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

编辑:

如果“转换器类型”在调用点是已知的,并且只有这种类型会在实用程序方法中使用,那么您可以在该方法上定义一个泛型类型并使用它,就像其他张贴者所建议的那样。

关于c# - 如何传入具有泛型类型参数的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12578965/

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