2012-03-30 88 views
2

是否可以创建new {variable = x.something}并动态指定变量名称?例如:LINQ中的动态新字段

var name = "dynamicName"; 
var result = context.select(x=> new {name.ToString() = x.something }) 

通过这种方式,我们将拥有一个列表,其中属性名称为dynamicName。 那么这是不可能的?

+1

。 http://msdn.microsoft.com/en-us/library/system.collections.specialized.namevaluecollection.aspx – Bazzz 2012-03-30 09:00:18

+0

为什么你需要这样的东西? – 2012-03-30 09:02:48

+0

@Daniel例如动态创建列名 – kosnkov 2012-03-30 09:05:36

回答

5

这对于匿名类型是不可能的,因为匿名类型不是动态的。它们必须在编译时完全定义。但是,你可以使用动态的物体,像ExpandoObject

var name = "dynamicName"; 
var result = context.Select(x => 
          { 
           var exp = new ExpandoObject() as IDictionary<string, object>; 
           exp[name] = x.something; 
           return (dynamic)exp; 
          }); 
+0

有趣的方法,我只是想知道你现在怎么可能以一种明智的方式使用'结果',因为从技术上来说,它可以是字面上任何事物的集合。只是一些食物的思想...... – Bazzz 2012-03-30 09:13:42

+1

“带声明正文的lambda表达式不能转换为表达式树” – kosnkov 2012-03-30 09:14:10

+0

@kosnkov,实际上这将与Linq一起使用对象,但我不认为有办法做与实体框架 – 2012-03-30 09:32:08

1

使用

Dictionary<string,string> myDic 

然后

myDic.Add(name.ToString(), x.something) 
+1

+1,但我会建议'Dictionary '然后。原因很简单,'x.something'不一定是一个字符串。 – Bazzz 2012-03-30 09:10:46

+0

@Bazzz是的,好点。 – 2012-03-30 09:30:43

1

您可以用Reflection.Emit的运行时创建匿名类型,但它不是非常容易(http://www.codeproject.com/Articles/13337/Introduction-to-Creating-Dynamic-Types-with-Reflec)。通常,对我们来说,更好的方法是使用`NameValueCollection`而不是匿名类型来代替您的字符串,数组或动态的