如何创建可变元组 class?

How to create mutable Tuple class?

如何正确继承 Tuple 并创建 MutableTuple class? 假设我有类似 Tuple<StringBuilder, int> 的东西,我希望它是可变的,所以我可以 getset 它的项目。

总的来说这可能不是最好的主意,但为了性能我需要它。也许除了使用 Tuple...

之外,还有另一种方法可以将两个对象打包成一个对象

你不应该那样做。 Tuple<> class 被设计为不可变的,所以即使你 可以 使用继承来解决它,你也将跳过箍来获得你想要的东西't.

我建议构建您自己的 class,您不需要继承。

现在,回答你的实际问题,如果你有一个 真的,真的 需要对象实际上是 Tuple<T1,T2> 的充分理由,你可以实现它使用反射:

class MutableTuple<T1, T2> : Tuple<T1, T2>
{
    private static readonly FieldInfo FieldInfoItem1 = typeof (Tuple<T1, T2>).GetField("m_Item1", BindingFlags.NonPublic | BindingFlags.Instance);
    private static readonly FieldInfo FieldInfoItem2 = typeof (Tuple<T1, T2>).GetField("m_Item2", BindingFlags.NonPublic | BindingFlags.Instance);

    public MutableTuple(T1 item1, T2 item2) : base(item1, item2)
    {
    }

    public void SetItem1(T1 item1)
    {
        FieldInfoItem1.SetValue(this, item1);
    }

    public void SetItem2(T2 item2)
    {
        FieldInfoItem2.SetValue(this, item2);
    }
}

这里有一些重要说明:

  • 这不能保证跨框架版本工作,因为它利用了私有实现细节。
  • 它可能比创建新元组慢(您提到了性能要求),因为您在进行反射时会受到性能影响。

简而言之,不要使用此代码。创建一个新的 class 如果你需要它可变的东西,并且包含两个项目。