无论如何都要接替这个样本吗?
string[] columns = ["a","b","c","d"];
var headers = from column in columns
select new
{
title = column,
filter = new { column = "select" },
show = true
};
调试此代码块后,我看到header.filter.column
属性。
我怎样才能看到header.filter.a
?
答案 0 :(得分:5)
这是不可能的,因为任何匿名类型都是匿名,但它们在编译时仍然存在 。因此,您无法使用运行时成员名称创建匿名类。
您实际执行的操作是设置名为column
的属性,其值为"select"
。
您可以做的是从结果中创建字典并使用字典访问数据:
var headerFilterDictionary = headers.ToDictionary(item => item.title, item => item.filter.column);
var columnFilterValue = headerFilterDictionary["a"];
答案 1 :(得分:0)
这可能不是你真正想做的事情(根本不是),但你可以使用dynamic
使语法(大多数)工作:
static void Main(string[] args)
{
string[] columns = { "a", "b", "c", "d" };
var headers = from column in columns
let c_a = (dynamic)(column == "a" ? new { a = column } : null)
let c_b = (dynamic)(column == "b" ? new { b = column } : null)
let c_c = (dynamic)(column == "c" ? new { c = column } : null)
let c_d = (dynamic)(column == "d" ? new { d = column } : null)
select new
{
title = column,
filter = c_a ?? c_b ?? c_c ?? c_d,
show = true
};
var filter_0 = headers.ElementAt(0).filter.a;
var filter_1 = headers.ElementAt(1).filter.b;
var filter_2 = headers.ElementAt(2).filter.c;
var filter_3 = headers.ElementAt(3).filter.d;
}
显然,这并不能很好地扩展;由于它是动态的,你不会在filter
上获得智能感知。
这可能最适合仅用于娱乐目的。