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

标签 c# c#-3.0 extension-methods type-inference

这是一个简单的示例,但希望能够说明我的查询。

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/

相关文章:

c# - 在 Visual Studio 2017 中设置默认的 C# 构建语言版本

c# - 摆脱 C# 中的预编译器指令

c# - 开发以管理员身份运行命令的应用程序

c# - 验证 SaveFileDialog 的 InitialDirectory?

c# - 如何将类型'string'转换为system.drawing.image

function - 为什么一个 Func 有效而另一个(几乎相同)无效

javascript - 模块化 JS 中的类扩展

Python 扩展方法

c# - 不明确的 IQueryable<T>.Where 和 IEnumerable<T>.Where 扩展方法

c# - 从控制台在新线程上创建表单