C# 正确地将动态转换为静态
我有一个C语言中的C# 正确地将动态转换为静态,c#,dynamic,C#,Dynamic,我有一个C语言中的动态对象,我想将其转换为静态对象。我编写了一个函数,它接受动态类型并返回静态类型,但实际上它返回动态,忽略指定的返回类型。(正如我现在发现的,这是标准行为。)AutoMapper不处理动态类型。如何正确地将动态转换为静态?我很困惑。。。我想.NET应该已经为你做了。下面是一些测试代码,它符合我的期望: class Program { static void Main(string[] args) { dynamic anythingGoes =
动态
对象,我想将其转换为静态对象。我编写了一个函数,它接受动态类型并返回静态类型,但实际上它返回动态
,忽略指定的返回类型。(正如我现在发现的,这是标准行为。)AutoMapper不处理动态类型。如何正确地将动态
转换为静态?我很困惑。。。我想.NET应该已经为你做了。下面是一些测试代码,它符合我的期望:
class Program
{
static void Main(string[] args)
{
dynamic anythingGoes = 1;
var convertedToInt = ConvertToType<int>(anythingGoes);
// expectation: should output Int32. and it does....
Console.WriteLine(convertedToInt.GetType().Name);
anythingGoes = "ribbit";
var convertedToString = ConvertToType<string>(anythingGoes);
// expectation: should output String. and it does also...
Console.WriteLine(convertedToString.GetType().Name);
Console.ReadLine();
}
// just a small method to cast the dynamic to whatever i want
// ...only for this test. not guaranteed to be crash safe. in fact, don't assume!
static T ConvertToType<T>(dynamic obj)
{
T result = obj;
return result;
}
}
类程序
{
静态void Main(字符串[]参数)
{
动态anythingGoes=1;
var convertedpoint=ConvertToType(anythinggo);
//期望值:应该输出Int32。它确实。。。。
Console.WriteLine(convertedpoint.GetType().Name);
anythingGoes=“ribbit”;
var convertedToString=ConvertToType(anythinggo);
//期望值:应该输出字符串。而且它也。。。
Console.WriteLine(convertedToString.GetType().Name);
Console.ReadLine();
}
//这只是一个小方法,可以将动态投射到我想要的任何地方
//…仅用于此测试。不保证碰撞安全。事实上,不要假设!
静态T转换类型(动态obj)
{
T结果=obj;
返回结果;
}
}
使用一些序列化程序可能是一种解决方案。假设您形成一个动态对象,如
dynamic d = new ExpandoObject();
d.a = 1;
d.b = new ExpandoObject();
d.b.c = "222";
您想将其转换为A
public class A
{
public int a { set; get; }
public B b { set; get; }
}
public class B
{
public string c { set; get; }
}
例如,您可以使用来执行此序列化/反序列化
A a = JsonConvert.DeserializeObject<A>(JsonConvert.SerializeObject(d));
A=JsonConvert.DeserializeObject(JsonConvert.SerializeObject(d));
如果您获得了类型,您可以实例化一个新对象,然后使用类将动态对象的状态复制到此对象中:
我的帖子特别提到“AutoMapper不处理<代码>动态代码>类型”,所以是的,我见过它。是否过时?可能重复:您可以发布示例代码吗?我不知道该答案是如何工作的,但我猜它是重复的。我很抱歉。@DanielA.White实际上,该代码不起作用——它返回动态
。我的dynamic
s是否都需要expando
才能正常工作?在Visual Studio中,将光标放在var
上。您将看到它被键入为dynamic
。convertedString的运行时类型将始终是string
,但编译时类型将是dynamic
,这就是这里的问题所在。@EZI:是吗?我这样做了,因此在我的代码示例中使用了内联注释。
var staticObject = Activator.CreateInstance(yourType);
MemberInfo[] members = FormatterServices.GetSerializableMembers(yourType);
FormatterServices.PopulateObjectMembers(staticObject, members,
FormatterServices.GetObjectData(dynObject, members));