是否可以对第一个参数使用类型推断并指定另一个类型?
本文关键字:类型 另一个 第一个 参数 是否 | 更新日期: 2023-09-27 18:08:55
这是一个简单的人为的例子,但希望能说明我的查询。
public class Test
{
public string Name = "test";
}
public static class Ext
{
public static Test ConvertToTest<T1>(this T1 source)
{
return new Test();
}
public static T2 Convert<T1,T2>(this T1 source) where T2 : new()
{
return new T2();
}
}
ConvertToTest只需要一个Type,所以下面的编译
Ext.ConvertToTest<string>("hello");
"hello".ConvertToTest();
最后一个使用type-interfence,这意味着它也适用于匿名类,例如
var anon = (new { Name = "test" }) ;
anon.ConvertToTest();
然而,这是硬编码的,总是使用类Test,而我希望能够在第二个方法
中指定类型我可以写
Ext.Convert<string, Test>("hello");
和this可以编译,因为我在编译时知道这两种类型,但是我不能在匿名类中使用它,而且我找不到使用类型推断加上额外的Type
的方法如果我能像
这样做就好了 anon.Convert<,Test>() ;
,编译器将知道对第一个类型(未指定)使用推断,并使用Test作为第二个类型。
有没有办法解决这个问题?
你不能在一个方法上做你所要求的,但是如果你聪明并且愿意定义几个不同的类,你应该能够使这样的语法成为可能:
var test = Ext.Convert("hello").To<Test>();
让Convert
基于一个泛型类型,并让它基于该泛型返回一个泛型类型:
public Converter<T> Convert<T>(T source)
{
return new Converter<T>(source);
}
然后在它返回的类型中添加一个方法,作为原始方法的基本包装:
public class Converter<T>
{
T _source;
internal Converter(T source)
{
_source = source;
}
public T2 To<T2>()
{
return Ext.Convert<T, T2>(_source);
}
}
有办法做你想做的事。您使用模板模式——它有点拼凑,但它允许您推断两种类型。它也可以用来推断匿名类型。
在这里:
public static T2 Convert<T1,T2>(this T1 source, Func<T2> template)
where T2 : new()
{
return new T2();
}
你可以这样调用它:
var anon = (new { Name = "test" }) ;
anon.Convert(() => new Test());
与你的伪代码相差不大