这是一个简单的示例,但希望能够说明我的查询。
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();
最后一个使用类型干扰,这意味着它也适用于匿名类,例如
var anon = (new { Name = "test" }) ;
anon.ConvertToTest();
但是,这是硬编码为始终使用类 Test,而我希望能够像第二种方法中那样指定类型
我可以写
Ext.Convert<string, Test>("hello");
这可以编译,因为我在编译时知道这两种类型,但我不能将它与匿名类一起使用,而且我找不到使用类型推断加上额外类型的方法
如果我能做类似的事情就好了
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);
}
}
关于c# - 是否可以对第一个参数使用类型推断并指定另一种类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7450879/