Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何创建可变元组类?_C#_Tuples - Fatal编程技术网

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