![](/img/trans.png)
[英]I can't get parameter names from valuetuple via reflection in c# 7.0
[英]How can I get the compiler aliases of ValueTuple field names for reflection
ValueTuples
允许为其公共字段( Item1
、 Item2
等)使用编译器别名。 例如:
var tuple = (Name:"apple",Date:DateTime.Now);
var nameFieldValue = tuple.Name;//"apple"
//here tuple.Name is a compiler alias for tuple.Item1
有什么办法可以通过反射做同样的事情吗?
var tuple = (Name:"apple",Date:DateTime.Now);
var nameFieldValue = tuple.GetType().GetField(nameof(tuple.Name)).GetValue(tuple);//null reference exception (the field is null)
我知道我可以这样做:
var tuple = (Name:"apple",Date:DateTime.Now);
var nameFieldValue = tuple.GetType().GetField("Item1").GetValue(tuple);//"apple"
但是我需要根据它们的编译器别名( tuple.Name
)而不是实际的字段名称( tuple.Item1
)来获取公共字段。
元组值名称是类似于局部变量的 C# 语言结构,编译代码后不存在。
编译器将翻译:
var tuple = (Name:"apple",Date:DateTime.Now);
var nameFieldValue = tuple.Name;
至:
ValueTuple<string, DateTime> valueTuple = new ValueTuple<string, DateTime>("apple", DateTime.Now);
string item = valueTuple.Item1;
如果您将该元组分配给另一个具有相同结构的元组:
var tuple = (Name:"apple",Date:DateTime.Now);
(string foo, DateTime bar) otherTuple = tuple;
编译器只会生成以下代码:
ValueTuple<string, DateTime> valueTuple = new ValueTuple<string, DateTime>("apple", DateTime.Now);
ValueTuple<string, DateTime> valueTuple2 = valueTuple;
在https://sharplab.io/上尝试一下
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.