【问题标题】:Using anonymous generic types with multiple generics使用具有多个泛型的匿名泛型类型
【发布时间】:2023-03-24 17:40:01
【问题描述】:

在查看了 Kirill Osenkov 的 blog(如何创建匿名类型的通用列表?)之后,我正在尝试做一些更高级的事情并遇到问题。

以下代码编译:

    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 的类型时,我似乎无法推断出这一点。这可能吗?

【问题讨论】:

  • 您打算如何在代码中使用T value?您也许可以只使用object

标签: c# generics types anonymous-types


【解决方案1】:

没有。 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】:

    不是一个真正令人满意的答案,但如果您可以容忍为每种类型 T2 编写不同版本的 DoSomethingWithT2,您可以执行以下操作:

    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();
    }
    

    最正确的答案是在这里停止使用匿名类型并使用元组或定义自己的类型。对不起。

    【讨论】:

      猜你喜欢
      • 2015-12-28
      • 1970-01-01
      • 2011-02-18
      • 2016-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多