2011-07-09 17 views
4

我有一个字符串变量myFieldname。我如何使用它的值作为linq表达式中的别名?在LINQ中为新的匿名对象的属性使用动态的“字符串别名”?

收起

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

我想theName是别名不是myFieldname本身。

+0

如果你需要这种动态 - 你可能会移动到PHP。 – zerkms

+3

@pst:可能是我失去了我的“讽刺”符号;-) – zerkms

+0

@zerkms哈哈。是的,确实:)我非常担心... – 2011-07-09 06:38:12

回答

6

因为匿名类型在您的代码中包含真实类型(包括属性名称),所以不能轻易实现。

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

为什么你想要属性名称是动态呢?为什么你不能调整在其他地方动态使用的名称?这里的大图是什么?

+0

,因为直到运行时才知道名称,并且因为网格的ItemSource设置了结果,所以动态名称是很重要的 – Mehrdad

+0

@Mehrdad:真的* shouldn' t *是这种情况 - 网格中名称的使用方式如何?在LINQ之前你会做什么?假设只是显示正确的头文件或类似的东西,我相信可以以不同的方式动态完成。如果你能给我们提供更多关于你想要做什么的信息,以及为什么你认为你需要它是动态的,那真的很有帮助。 –

7

你不能(至少,没有任何理智的方式)。我可以看到这样做的唯一方法是使用在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,但即使如此,我不清楚这是什么意思帮助你与...

+0

这正是我想要的,但它说:不能将索引与[]应用到类型'System.Dynamic.ExpandoObject'的表达式 – Mehrdad

+0

@Mehrdad我认为它有一个索引器;使用.Add来代替 –

+0

@Mehrdad查看更新 –

相关问题