C# 正确地将动态转换为静态

C# 正确地将动态转换为静态,c#,dynamic,C#,Dynamic,我有一个C语言中的动态对象,我想将其转换为静态对象。我编写了一个函数,它接受动态类型并返回静态类型,但实际上它返回动态,忽略指定的返回类型。(正如我现在发现的,这是标准行为。)AutoMapper不处理动态类型。如何正确地将动态转换为静态?我很困惑。。。我想.NET应该已经为你做了。下面是一些测试代码,它符合我的期望: class Program { static void Main(string[] args) { dynamic anythingGoes =

我有一个C语言中的
动态
对象,我想将其转换为静态对象。我编写了一个函数,它接受动态类型并返回静态类型,但实际上它返回
动态
,忽略指定的返回类型。(正如我现在发现的,这是标准行为。)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));