Возможно ли создать именованный тип кортежа с помощью отражения? - PullRequest
0 голосов
/ 18 мая 2018

Я могу создать обычный тип кортежа с помощью Tuple.Create или typeof(Tuple<,>).MakeGenericType и т. Д., Но как я могу создать именованный кортеж?С другими именами свойств, отличными от Item1, Item2 и т. Д., С использованием отражения во время выполнения.

1 Ответ

0 голосов
/ 18 мая 2018

Нет, вы не можете, потому что именованные кортежи в основном просто синтетический сахар.

Если вы рассмотрите этот код:

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.

...