如何创建可变的Tuple类?

时间:2015-08-09 16:53:53

标签: c# tuples

如何从Tuple正确继承并创建MutableTuple课程? 我们说我有Tuple<StringBuilder, int>这样的东西,我希望它是可变的,所以我可以getset它的项目。

一般来说,这可能不是最好的主意,但出于性能考虑,我需要这样做。除了使用Tuple ...

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

1 个答案:

答案 0 :(得分:4)

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

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

现在,为了回答你的实际问题,如果你有一个真的,非常好的理由需要该对象实际上是Tuple<T1,T2>,你可以使用反射实现它: / p>

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

这里有一些重要的注意事项:

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

简而言之,请勿使用此代码。如果你需要一些可变的东西,那就创建一个新类,并包含两个项目。