如何从Tuple
正确继承并创建MutableTuple
课程?
我们说我有Tuple<StringBuilder, int>
这样的东西,我希望它是可变的,所以我可以get
和set
它的项目。
一般来说,这可能不是最好的主意,但出于性能考虑,我需要这样做。除了使用Tuple
...
答案 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);
}
}
这里有一些重要的注意事项:
简而言之,请勿使用此代码。如果你需要一些可变的东西,那就创建一个新类,并包含两个项目。