C# 将ExpandoObject转换为匿名类型的T

C# 将ExpandoObject转换为匿名类型的T,c#,system.reflection,C#,System.reflection,我正试图克隆一个匿名类型并输入一些奇怪的行为 谁能告诉我为什么,并告诉我一个解决办法。 下面是一个测试代码 public static T DeepClone(此T objecttobeclone),其中T:class { //这将始终返回null。 将克隆(objectToBeCloned)返回为T; //如果我尝试,它会以某种方式起作用 //var o=动态克隆(objectToBeCloned); //如果我尝试,将得到一个异常不能投 //将对象扩展为匿名类型,即使我可以将其转换为动态 /

我正试图克隆一个匿名类型并输入一些奇怪的行为

谁能告诉我为什么,并告诉我一个解决办法。 下面是一个测试代码

public static T DeepClone(此T objecttobeclone),其中T:class
{
//这将始终返回null。
将克隆(objectToBeCloned)返回为T;
//如果我尝试,它会以某种方式起作用
//var o=动态克隆(objectToBeCloned);
//如果我尝试,将得到一个异常不能投
//将对象扩展为匿名类型,即使我可以将其转换为动态
//var o=(T)克隆(objectToBeCloned);
}
//克隆法
公共静态对象克隆(此对象对象对象克隆){
对象再对象;
if(primaryType.IsAnonymousType())//动态类型
{
var props=FastDeepClonerCachedItems.GetFastDeepClonerProperties(primaryType);
resObject=新的ExpandooObject();
var d=作为IDictionary的resObject;
foreach(属性值中的变量属性)
{
var item=prop.GetValue(objectToBeCloned);
如果(项==null)
继续;
var值=prop.IsInternalType?项目:克隆(项目);
如果(!d.ContainsKey(道具名称))
d、 添加(道具名称、价值);
}
返回再对象;
}
动态测试={p1=“sd”};
var v=测试。深度克隆(测试);
//在这种情况下,v总是空的。我不明白为什么

这不是最干净的代码,但它克隆了匿名类型:

var original = new  { Name = "Albert", Age = 99 };

var constructor = original.GetType().GetConstructors().First();

var parameters = constructor.GetParameters();

var properties = original.GetType().GetProperties();

var arguments =
(
    from pa in parameters
    join pr in properties on pa.Name equals pr.Name
    select pr.GetValue(original)
).ToArray();

var clone = constructor.Invoke(arguments);

因为匿名类型是不可变的,所以没有多大用处。

匿名类型不是动态的。编译器在编译时创建静态类型。
ExpandoObject
在运行时创建。它们是两个不同的东西。你不能将它们彼此强制转换。我明白了,你认为解决这种情况的最佳方法是什么?我创建了一个新的mMethod
DynamicClon
将返回匿名类型,有更好的方法吗?为什么还要克隆匿名类型?它们是不可变的引用类型。克隆对我来说没有意义。我自己也不确定,但我有一个库
FastDeepCloner
,有人想克隆匿名类型。我想克隆k每个人都有其原因。无论如何,我已经通过创建单独的方法DynamicClone()解决了这个问题,该方法返回
ExpandoObject
这至少应该满足用户的要求。