如何创建可变元组 class?
How to create mutable Tuple class?
如何正确继承 Tuple
并创建 MutableTuple
class?
假设我有类似 Tuple<StringBuilder, int>
的东西,我希望它是可变的,所以我可以 get
和 set
它的项目。
总的来说这可能不是最好的主意,但为了性能我需要它。也许除了使用 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 如果你需要它可变的东西,并且包含两个项目。
如何正确继承 Tuple
并创建 MutableTuple
class?
假设我有类似 Tuple<StringBuilder, int>
的东西,我希望它是可变的,所以我可以 get
和 set
它的项目。
总的来说这可能不是最好的主意,但为了性能我需要它。也许除了使用 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 如果你需要它可变的东西,并且包含两个项目。