我喜欢将泛型类型转换器函数发送到方法,但我无法弄清楚如何做到这一点.
这是解释我想要实现的内容的无效语法,问题是我不知道如何与我的func一起指定泛型类型:
public void SomeUtility(Func<T><object,T> converter)
{
var myType = converter<MyType>("foo");
}
Run Code Online (Sandbox Code Playgroud)
编辑(参见我在Lawrence评论中的讨论):通过"泛型转换器"我的意思是我想传入一个可以转换为任何强类型<T>(不是对象)的转换器,所以我的下一行方法可能是:
var myOtherType = converter<MyOtherType>("foo");
Run Code Online (Sandbox Code Playgroud)
我想作为参数传递的委托看起来像这样:
private delegate TOutput myConverterDelegate<TOutput>(object objectToConvert);
Run Code Online (Sandbox Code Playgroud)
这更像是一种语法/ C#探索,为了完成工作,我可能会使用一个接口,但我希望这可以用func/delegate来实现.
Law*_*eld 23
您不能拥有通用函数或操作的实例 - 所有类型参数都是预先定义的,并且不能由调用者重新定义.
一种简单的方法是依靠向下转换来完全避免多态性:
public void SomeUtility(Func<Type, object, object> converter)
{
var myType = (MyType)converter(typeof(MyType), "foo");
}
Run Code Online (Sandbox Code Playgroud)
如果需要类型安全性,则需要将类型参数的定义推迟给调用者.您可以通过在界面中组合通用方法来完成此操作:
public void SomeUtility(IConverter converter)
{
var myType = converter.Convert<MyType>("foo");
}
interface IConverter
{
T Convert<T>(object obj);
}
Run Code Online (Sandbox Code Playgroud)
编辑:
如果在调用站点已知'转换器类型',并且在实用程序方法中只使用此类型,那么您可以在方法上定义泛型类型并使用它,就像其他海报所建议的那样.
Dar*_*rov 17
public void SomeUtility<T>(Func<object, T> converter)
{
var myType = converter("foo");
}
Run Code Online (Sandbox Code Playgroud)
然后:
SomeUtility(arg => new MyType());
Run Code Online (Sandbox Code Playgroud)
在这种情况下,泛型类型推断将起作用.
你也需要制作SomeUtility通用的.这样做并修复语法给出:
public void SomeUtility<T>(Func<object,T> converter)
{
var myType = converter("foo");
}
Run Code Online (Sandbox Code Playgroud)