如何使用泛型类型参数传入func?

时间:2012-09-25 08:26:57

标签: c# func

我喜欢将泛型类型转换器函数发送到方法,但我无法弄清楚如何操作。

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

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

编辑(另请参阅我在Lawrence评论中的讨论):通过“泛型转换器”我的意思是我希望传递一个转换器,它可以转换为任何强类型&lt; T&gt; (不是对象),所以我方法的下一行可能是:

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

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

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

现在更多的是语法/ C#探索,为了完成工作,我可能会使用一个接口,但我希望这可以用func / delegate来完成。

4 个答案:

答案 0 :(得分:22)

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

一种简单的方法是依靠向下转换来完全避免多态:

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

修改

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

答案 1 :(得分:16)

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

然后:

SomeUtility(arg => new MyType());

在这种情况下,通用类型推断将起作用。

答案 2 :(得分:7)

您还需要SomeUtility通用。这样做并修复语法会给出:

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

答案 3 :(得分:3)

您必须在编译时知道T类型才能使用它。 T可以在类级别或方法级别指定。

class SomeClass<T> {
    public void SomeUtility(Func<object, T> converter) {
        var myType = converter("foo"); // Already is the T-type that you specified.
    }
}

public void SomeUtility<T>(Func<object, T> converter) {
    var myType = converter("foo"); // Already is the T-type that you specified.
}