代码之家  ›  专栏  ›  技术社区  ›  CodeGrue

将匿名泛型类型与多个泛型一起使用

  •  2
  • CodeGrue  · 技术社区  · 15 年前

    在回顾了这个之后 blog 作者Kirill Osenkov(如何创建一个匿名类型的通用列表?)我正在尝试做一些更高级的事情,但有一些问题。

    编译以下代码:

        var anon = new { One = "1", Two = "2" };
        var result = DoSomething(anon);
    
        public static T DoSomething<T>(T value)
        {
            return value;
        }
    

        var anon = new { One = "1", Two = "2" };
        var result = DoSomethingElse<int>(anon);
    
        public static T2 DoSomethingElse<T, T2>(T value)
            where T2 : new()
        {
            return new T2();
        }
    

    因为我没有办法指定T是typeof(anon),所以当给T2一个类型时,我似乎无法让它推断出这一点。这可能吗?

    2 回复  |  直到 15 年前
        1
  •  2
  •   JaredPar    15 年前

    不支持。C编译器不支持这种类型的功能。必须手动指定所有泛型参数,或者不指定泛型参数并依赖于类型推断。

    最接近的是

    var anon = new { One = "1", Two = "2" };
    var result = DoSomethingElse(anon,42);
    
    public static T2 DoSomethingElse<T, T2>(T value, T2 otherValue)
        where T2 : new()
    {
        return new T2();
    }
    
        2
  •  0
  •   mqp    15 年前

    这不是一个令人满意的答案,但如果你能容忍写一个不同版本的 DoSomethingWithT2 每种类型 T2

    var anon = new { One = "1", Two = "2" };
    var result = DoSomethingWithInt(anon);
    
    public static int DoSomethingWithInt<T>(T value)
    {
        return DoSomethingElse<T, int>(value);
    }
    
    public static T2 DoSomethingElse<T, T2>(T value) where T2 : new()
    {
        return new T2();
    }
    

    正确的答案是不要在这里使用匿名类型,而是使用元组或定义自己的类型。对不起的。