如何在c#中通过属性索引获取Tuple属性?

时间:2013-09-01 12:15:44

标签: c# tuples

我需要为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吗?

2 个答案:

答案 0 :(得分: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
};

答案 1 :(得分:0)

一个鲜为人知的事实是,所有元组都实现了稍微模糊的接口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
};