【问题标题】:Use dynamic "string alias" for new anonymous object's property in LINQ? [duplicate]在 LINQ 中为新匿名对象的属性使用动态“字符串别名”? [复制]
【发布时间】:2011-07-09 17:20:27
【问题描述】:

我有一个字符串变量 myFieldname。如何在 linq 表达式中使用它的值作为别名?

折叠

string myFieldname = "theName";
var q = (from d in data select new { d.Id, myFieldname = d.Amount });

我希望 theName 成为别名而不是 myFieldname 本身。

【问题讨论】:

  • 如果你需要这种动态 - 你可以改用 php。
  • @pst:可能我丢了我的“讽刺”标志;-)
  • @zerkms 哈哈。是的,确实:) 我非常担心......

标签: c# linq


【解决方案1】:

你不能(至少,不是以任何理智的方式)。我能看到的唯一方法是使用 expando 对象,然后:

foreach(var pair in data select new { d.Id, d.Amount})
{
    var obj = new ExpandoObject();
    IDictionary<string, object> dict = obj;
    dict[myFieldname] = obj.Amount;
    dict["Id"] = d.Id;
    // add obj to a list or similar
}

您可以将ExpandoObjectdynamic API 一起使用,但即便如此我也不清楚这对您有什么帮助...

【讨论】:

  • 这正是我想要的,但它说:无法将 [] 索引应用于“System.Dynamic.ExpandoObject”类型的表达式
  • @Mehrdad 我以为它有一个索引器;使用 .Add 代替
【解决方案2】:

无论如何,您都不能 - 因为匿名类型在您的代码中最终成为 real 类型,包括属性名称。

您必须在执行时生成一个类型,然后为您的投影创建一个表达式树。对我来说,这听起来像是很多的工作。

为什么您仍然希望属性名称是动态的?为什么不能动态调整在别处使用的名称?这里的大局是什么?

【讨论】:

  • 因为直到运行时我才知道名称,并且因为结果是为网格的 ItemSource 设置的,所以动态名称很重要
  • @Mehrdad:真的不应该是这样的——这个名字在网格中是如何使用的?在 LINQ 之前你会做什么?假设这只是显示正确标题或类似内容的问题,我确信可以以不同的方式动态完成。如果您能向我们提供更多信息,说明您正在尝试做什么以及为什么您认为需要它是动态的,那将非常有帮助。
猜你喜欢
  • 1970-01-01
  • 2011-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-11
相关资源
最近更新 更多