C# 如何创建可变元组类?
如何正确继承C# 如何创建可变元组类?,c#,tuples,C#,Tuples,如何正确继承Tuple并创建MutableTuple类? 假设我得到了类似于Tuple的东西,我希望它是可变的,所以我可以get和set它的项 一般来说,这可能不是最好的主意,但出于性能考虑,我需要这样做。除了使用Tuple…之外,可能还有另一种方法可以将两个对象打包成一个对象。您不应该这样做。Tuple类被设计为不可变的,因此即使您可以使用继承来解决它,您也会为了得到您不想要的东西而跳槽 我建议您在构建自己的类时,不需要继承 现在,为了回答您的实际问题,如果您有一个非常非常很好的理由要求对象实
Tuple
并创建MutableTuple
类?
假设我得到了类似于Tuple
的东西,我希望它是可变的,所以我可以get
和set
它的项
一般来说,这可能不是最好的主意,但出于性能考虑,我需要这样做。除了使用
Tuple
…之外,可能还有另一种方法可以将两个对象打包成一个对象。您不应该这样做。Tuple类被设计为不可变的,因此即使您可以使用继承来解决它,您也会为了得到您不想要的东西而跳槽
我建议您在构建自己的类时,不需要继承
现在,为了回答您的实际问题,如果您有一个非常非常很好的理由要求对象实际上是一个元组
,您可以使用反射来实现它:
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可变元组:元组
{
private static readonly FieldInfo FieldInfoItem1=typeof(Tuple).GetField(“m_Item1”,BindingFlags.NonPublic | BindingFlags.Instance);
private static readonly FieldInfo FieldInfoItem2=typeof(Tuple).GetField(“m_Item2”,BindingFlags.NonPublic | BindingFlags.Instance);
公共可变元组(T1项1,T2项2):基(项1,项2)
{
}
公共无效集合项1(T1项1)
{
FieldInfoItem1.SetValue(本,item1);
}
公共无效集合项2(T2项2)
{
FieldInfoItem2.SetValue(此项为item2);
}
}
这里有一些重要的注意事项:
- 这不能保证跨框架版本工作,因为它利用了私有实现细节
- 这可能比创建新的元组(您提到了性能要求)要慢,因为在进行反射时会影响性能
简而言之,不要使用此代码。如果您需要一个可更改的类,并包含两项,请创建一个新类。Honstley:这应该是不可能的。当然,您可以从Tuple继承并定义setter,这些setter返回一个新的Tuple,但这会破坏您的ideait,最好创建自己的类,并根据需要对其进行自定义want@ChristianSauer如果我需要设置第二项,那么是否应该设置类似于
Tuple
?