2011-05-18 67 views
14

比方说,我有如下一段代码:设置匿名类型的属性名称

string SomeConst = "OtherName"; 
var persons = GetPersons(); //returns list of Person 
var q = persons.Select(p => 
new 
{ 
    SomeConst = p.Name 
}); 

基本上我所期待的q将具有匿名类型的序列与命名属性 中文别名,而不是SomeConst。 我该如何实现这样的行为?

+0

为什么你就不能到位SomeConst'的'使用'OtherName'? – SWeko 2011-05-18 12:17:51

+4

这是显而易见的解决方案,这就是它现在实现 我在寻找更通用的解决方案现在 – user759141 2011-05-18 12:22:00

+0

如果你已经实现了它,然后有什么问题呢? – Fermin 2011-05-18 12:23:30

回答

10

你不能做到这一点。编译时必须知道匿名类型的属性名称。为什么你需要这样做?

string SomeConst = "OtherName"; 
var persons = GetPersons(); //returns list of Person 
var q = persons.Select(p => 
new Dictionary<string, string> 
{ 
    { SomeConst, p.Name } 
}); 
+0

说,属性名称是从存储在某些字典或外连它的恒定变量 萃取。如果变量是常量而不是在编译时已知的值? – user759141 2011-05-18 12:20:01

+2

有没有像“常量变量”这样的东西...如果它是一个常量,你可以直接使用实际的名字,当你创建匿名对象。如果它是一个变量,这是不可能的,但你可以用我的答案 – 2011-05-18 12:22:38

+0

中解释的字典来完成是的,该值在编译时已知,但它是一个字符串,而不是一个标识符... – 2011-05-18 12:23:24

0

我知道你唯一的办法可以动态地添加在编译时名字是未知的性质是:

您可以通过创建字典而不是匿名对象序列达到类似的效果ExpandoObject:

var q = persons.Select(p => { dynamic obj = new ExpandoObject(); obj.Name = p.Name; return obj; }); 

但我实在看不出在做这样的事感兴趣。这很可能是一个非常糟糕的设计/想法。你无疑将创造更多的尴尬,无法读取和unmaintenable代码比你解决任何问题......

+0

,这会给我语法错误:“带有语句正文的lambda表达式不能转换为表达式树” – Star 2015-01-23 07:09:28