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

本文关键字:属性 索引 获取 Tuple | 更新日期: 2023-09-27 18:29:51

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

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

一个可能未知的事实是,所有元组都实现了有点模糊的接口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
};

我可能会选择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
};