【问题标题】:Setting anonymous type property name设置匿名类型属性名称
【发布时间】:2011-05-18 12:14:53
【问题描述】:

假设我有以下代码:

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

基本上我希望在 q 序列中具有匿名类型的属性 命名为 OtherName 而不是 SomeConst。 我怎样才能实现这样的行为?

【问题讨论】:

  • 为什么不能用OtherName 代替SomeConst
  • 这是显而易见的解决方案,这就是它现在实施的方式我现在正在寻找更通用的解决方案
  • 如果你已经实现了,那有什么问题?
  • const string SomeConst = "OtherName" 能解决问题吗?

标签: c# linq properties anonymous


【解决方案1】:

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

您可以通过创建一系列字典而不是匿名对象来实现类似的效果:

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

【讨论】:

  • 说,属性名称是从存储在某个字典甚至外部的常量变量中提取的。如果变量是常量,它的值在编译时不是已知的吗?
  • 没有所谓的“常量变量”……如果是常量,可以在创建匿名对象时直接使用实际名称。如果它是一个变量,这是不可能的,但你可以用我的回答中解释的字典来做到这一点
  • 所以如果我将第一行更改为 const string SomeConst
  • 因为我在其他地方使用了这个值,并且想避免在上千个不同的地方输入相同的字符串值;因此我只是声明了变量来保存该值,其中一种用法是作为匿名类型中的属性名称。显然该框架不允许这种用法,所以我会坚持使用其他方法。感谢您的耐心等待
  • 如果你在多个地方使用相同的匿名类型,你应该创建一个命名类型
【解决方案2】:

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

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

但我真的看不出有任何兴趣做这样的事情。这样做很可能是一个非常糟糕的设计/想法。毫无疑问,您将创建比您解决任何问题更多的笨拙、不可读和不可维护的代码......

【讨论】:

  • 这给我语法错误:“带有语句体的 lambda 表达式无法转换为表达式树”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多