是否可以对第一个参数使用类型推断并指定另一个类型?

本文关键字:类型 另一个 第一个 参数 是否 | 更新日期: 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());

与你的伪代码相差不大