可能使用反射创建命名元组类型?
Possible create named tuple type using reflection?
我可以用 Tuple.Create
或 typeof(Tuple<,>).MakeGenericType
等创建一个普通的元组类型,但是我怎样才能创建一个命名的元组?除了 Item1
、Item2
等其他 属性 名称,在运行时使用反射。
不,你不能,因为命名元组在很大程度上只是语法糖。
如果你考虑这段代码:
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 构造函数。
我可以用 Tuple.Create
或 typeof(Tuple<,>).MakeGenericType
等创建一个普通的元组类型,但是我怎样才能创建一个命名的元组?除了 Item1
、Item2
等其他 属性 名称,在运行时使用反射。
不,你不能,因为命名元组在很大程度上只是语法糖。
如果你考虑这段代码:
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 构造函数。