可能使用反射创建名为tuple的类型?

时间:2018-05-18 16:14:47

标签: c# reflection tuples namedtuple

我可以使用Tuple.Createtypeof(Tuple<,>).MakeGenericType等创建一个普通的元组类型,但是如何创建一个命名元组呢?使用其他属性名称而不是Item1Item2等,在运行时使用反射。

1 个答案:

答案 0 :(得分:0)

不,你不能,因为命名元组主要只是合成糖。

如果您考虑以下代码:

private void button1_Click(object sender, EventArgs e)
{
    var abc = Get();
    MessageBox.Show(string.Format("{0}: {1}", abc.name, abc.age));  
}

private (string name, int age) Get()
{
    return ("John", 30);
}

然后查看反编译代码(我使用JetBrains的dotPeek):

private void button1_Click(object sender, EventArgs e)
{
  ValueTuple<string, int> valueTuple = this.Get();
  int num = (int) MessageBox.Show(string.Format("{0}: {1}", (object) valueTuple.Item1, (object) (int) valueTuple.Item2));
}

[return: TupleElementNames(new string[] {"name", "age"})]
private ValueTuple<string, int> Get()
{
  return new ValueTuple<string, int>("John", 30);
}

你可以看到,即使MessageBox代码使用名称,它在编译时实际上也会转换为.Item1.Item2。因此,您应该只使用ValueType构造函数。