如何使用变量的值作为c#中的键来声明匿名类型?

时间:2016-12-08 13:52:04

标签: c# linq

无论如何都要接替这个样本吗?

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

2 个答案:

答案 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上获得智能感知。

这可能最适合仅用于娱乐目的。