C# 如何传入带有泛型类型参数的func?
我喜欢向方法发送泛型类型转换器函数,但我不知道如何执行 下面的无效语法解释了我想要实现的功能,问题是我不知道如何与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
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);
}