为匿名类型设置属性名称

38

假设我有以下代码:

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

基本上,我希望在q序列中有一个匿名类型,它具有名为OtherName而不是SomeConst的属性。我该如何实现这样的行为?


为什么你不能在SomeConst的位置使用OtherName呢? - SWeko
8
那是显而易见的解决方案,现在就是这样实施的。 我现在正在寻求更通用的解决方案。 - user759141
如果你已经实现了它,那么问题在哪里? - Fermin
这样写可以吗?常量字符串 SomeConst = "OtherName"。 - user759141
2个回答

33

你做不到。匿名类型的属性名必须在编译时已知。为什么你需要这样做呢?

你可以通过创建字典序列来代替使用匿名对象来实现类似的效果:

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

假设要从某个字典中或者字典外部的常量变量中提取属性名称。如果该变量是常量,那么它的值在编译时就已知了吧? - user759141
2
不存在所谓的“常量变量”……如果它是一个常量,你可以在创建匿名对象时直接使用实际名称。如果它是一个变量,这是不可能的,但你可以像我的答案中所解释的那样使用字典来实现。 - Thomas Levesque
所以,如果我将第一行更改为 const string SomeConst - user759141
1
因为我在其他地方使用了这个值,并且想要避免在一千个不同的地方输入相同的字符串值;因此,我只是声明了一个变量来保存该值,其中一个用法是作为匿名类型中的属性名称。显然,框架不允许这样的用法,所以我会采用其他方法。感谢您的耐心。 - user759141
9
如果您在多个地方使用相同的匿名类型,应该创建一个命名类型。 - Thomas Levesque
显示剩余2条评论

0

我所知道的唯一动态添加属性名称在编译时未知的方法是使用ExpandoObject:

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

但我真的不认为有任何兴趣去做这样的事情。这很可能是一个非常糟糕的设计/想法。你肯定会创造出更多笨拙、难以阅读和难以维护的代码,而不是解决任何问题...


这个代码给我语法错误:"带有语句主体的lambda表达式无法转换为表达式树"。 - Alaa Jabre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接