使用Linq.Dynamic或表达式创建新的匿名对象

使用Linq.Dynamic或表达式创建新的匿名对象,linq,dynamic,casting,anonymous-types,Linq,Dynamic,Casting,Anonymous Types,我有以下代码: public class C { public string Field {get; set;} public string Data {get; set;} } var x = new C { Field = "F", Data = "Data 1" }; var y = new C { Field = "G", Data = "Data 2" }; 我想把它转换成一个匿名对象,比如: var x_a = new { F = "Data 1" }; var y_a

我有以下代码:

public class C
{
  public string Field {get; set;}
  public string Data {get; set;}
}

var x = new C { Field = "F", Data = "Data 1" };
var y = new C { Field = "G", Data = "Data 2" };
我想把它转换成一个匿名对象,比如:

var x_a = new { F = "Data 1" };
var y_a = new { G = "Data 2" };
请注意,属性名(F或G)是内容,因此可以动态更改。我目前正在为此使用System.Linq.Dynamic“Select”方法:

public static object CastToAnonymous(this C source)
{
  var objects = new List<C>(new [] {source}).AsQueryable().Select("new (Data as " + source.Field + ")") as IEnumerable<object>;
  return objects.First();
}
公共静态对象CastToAnonymous(此C源代码)
{
var objects=newlist(new[]{source}).AsQueryable().Select(“new(数据为“+source.Field+”))作为IEnumerable;
返回objects.First();
}


我想知道是否有更简单的方法来实现这一点?

除了必须回答的问题,为什么要这样做(我真的很想知道),我认为没有更简单的方法,因为
System.Linq.Dynamic
已经为您实现了表达式解析功能,所以您的代码已经是一行程序了。仅供参考,在动态linq库中使用
Select()
获得的对象与编译器生成的对象不兼容。它真的需要是一个类型化的匿名对象吗?为什么不把它放在一个动态对象中呢?使用expando对象或编写动态包装器。为什么要将其强制转换为具有相同字段的匿名类型?那么你想用它做什么呢?仅供参考,从技术上讲,这不是一个强制转换。你不能把这些值放到字典里吗?你让事情变得更难了。