如何在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
吗?
一个可能未知的事实是,所有元组都实现了有点模糊的接口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
/else
或switch
,但如果你想避免这种情况(例如,这样你就可以将其与任何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
};