【问题标题】:How to get Tuple property by property index in c#?如何在 c# 中通过属性索引获取元组属性?
【发布时间】:2013-09-01 12:15:43
【问题描述】:

我需要为 Tuple 实现 Comparison 委托。我有一个列号,我想用它来比较元组。

现在我必须:

int sortedColumn;
Comparison<Tuple<T1, T2, T3>> tupleComparison = (x, y) =>
{
    // I want to access x.Item2 if sortedColumn = 2
        // x.Item3 if sortedColumn = 2 etc      
};

如何在 C# 中做到这一点?

我可以不使用switch吗?

【问题讨论】:

  • 你可以做到,x.Item2 应该可以工作,有什么问题?
  • 问题是我不想写N个if/switch检查
  • T1,T2,T3 是同一类型吗?
  • 不,它们是不同的类型,如果我写的话,它们会是:Tuple :)
  • T1,T2,T3 之间有什么关系吗?发布您在里面比较的内容,以便我们更好地了解如何简化它

标签: c# tuples


【解决方案1】:

一个可能不为人知的事实是所有元组都实现了有点晦涩的接口ITuple。该接口定义了两个方法(Length 返回元组中的项目数,以及一个索引访问方法 [] - 从零开始),但它们都是隐藏的,这意味着您必须显式地转换您的元组变量到实现的接口,然后使用相关方法。

请注意,您必须最终将访问的项目转换为其固有类型,因为索引访问方法始终返回object

Comparison<Tuple<T1, T2, T3>> tupleComparison = (x, y) =>
{
    var columnValue = (int)((ITuple)x)[sortedColumn];     // Don't forget to cast to relevant type
};

【讨论】:

    【解决方案2】:

    我可能会选择 if/elseswitch,但如果你想避免这种情况(例如,你可以将它与任何 Tuple 一起使用),你可以使用反射:

    Comparison<Tuple<T1, T2, T3>> tupleComparison = (x, y) =>
    {
        var prop = typeof(Tuple<T1, T2, T3>).GetProperty("Item" + sortedColumn);
        var xItem = prop.GetValue(x);
        var yItem = prop.GetValue(y);
        return // something to compare xItem and yItem
    };
    

    【讨论】:

    • 太棒了!正是我一直需要的:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    • 2016-02-25
    • 1970-01-01
    相关资源
    最近更新 更多