Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何传入带有泛型类型参数的func?_C#_Func - Fatal编程技术网

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

C# 如何传入带有泛型类型参数的func?,c#,func,C#,Func,我喜欢向方法发送泛型类型转换器函数,但我不知道如何执行 下面的无效语法解释了我想要实现的功能,问题是我不知道如何与func一起指定泛型类型: public void SomeUtility(Func<T><object,T> converter) { var myType = converter<MyType>("foo"); } public实用程序(Func转换器) { var myType=转换器(“foo”); } 编辑(另请参见我在与La

我喜欢向方法发送泛型类型转换器函数,但我不知道如何执行

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

public void SomeUtility(Func<T><object,T> converter)
{
    var myType = converter<MyType>("foo");
}
public实用程序(Func转换器)
{
var myType=转换器(“foo”);
}
编辑(另请参见我在与Lawrence的评论中的讨论):我所说的“泛型类型转换器”是指我希望传入一个可以转换为任何强类型(而不是对象)的转换器,因此我的方法中的下一行可以是:

var myOtherType = converter<MyOtherType>("foo");
var myOtherType=转换器(“foo”);
我希望作为参数传递的委托如下所示:

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

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

您还需要将
SomeUtility
设置为泛型。执行此操作并修复语法将提供:

public void SomeUtility<T>(Func<object,T> converter)
{
    var myType = converter("foo");
}
public实用程序(Func转换器)
{
var myType=转换器(“foo”);
}

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

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

class SomeClass<T> {
    public void SomeUtility(Func<object, T> converter) {
        var myType = converter("foo"); // Already is the T-type that you specified.
    }
}
class-SomeClass{
公用程序(Func转换器){
var myType=converter(“foo”);//已经是您指定的T型。
}
}

public实用程序(Func转换器){
var myType=converter(“foo”);//已经是您指定的T型。
}

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

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

public void SomeUtility(Func<Type, object, object> converter)
{
    var myType = (MyType)converter(typeof(MyType), "foo");
}
public实用程序(Func转换器)
{
var myType=(myType)转换器(typeof(myType),“foo”);
}
如果希望类型安全,则需要将类型参数的定义推迟到调用方。您可以通过在接口中组合泛型方法来实现这一点:

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

interface IConverter
{
   T Convert<T>(object obj);
}
public void SomeUtility(IConverter转换器)
{
var myType=converter.Convert(“foo”);
}
接口转换器
{
T转换(对象对象对象);
}
编辑:


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

您在方法体中指定的类型是否重要?您是否暗示此方法可能需要对多个类型进行转换,而不是调用方定义的一个特定类型?是的,这就是我试图表达为“泛型类型转换器”的内容,因此下一行可以是var myOtherType=converter(“foo”);好的-那么我想你会发现我的答案很有用:)好的,谢谢,是的,我可能只会使用一个界面,谢谢你给我指明了那个方向。但是,出于兴趣,委托/a函数不应该传递泛型类型吗?描述为委托,我想我会这样写:私有委托TOutput myConverterDelegate(objectobjecttoconvert);-但当我尝试使用它作为参数时,我得到“需要1类型参数”,您当然可以定义泛型委托,毕竟,这正是Func和Action的含义。它们被视为泛型定义,就像泛型接口和类一样。但是,不能在方法签名中使用泛型定义,只能在参数化泛型类型中使用。很简单,你不能单靠一名代表来完成你想要完成的事情。
public void SomeUtility<T>(Func<object, T> converter) {
    var myType = converter("foo"); // Already is the T-type that you specified.
}
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);
}