使用ImpromptuInterface时如何解决此枚举转换问题?

时间:2012-05-06 05:26:32

标签: c#-4.0 dynamic json.net duck-typing impromptu-interface

给出以下代码:

public enum Pet
{
    Cat,
    Dog
}

public interface IOwner
{
    Pet Pet
    {
        get;
        set;
    }
}

public class Owner : IOwner
{
    public Pet Pet
    {
        get;
        set;
    }
}

以下测试失败:

[TestFixture]
public class ImpromptuInterfaceExample
{
    private Owner owner;
    private ExpandoObject dynamicOwner;

    [SetUp]
    public void SetUp()
    {
        owner = new Owner { Pet = Pet.Dog };
        string serializedOwner = JsonConvert.SerializeObject(owner);
        dynamicOwner = JsonConvert.DeserializeObject<ExpandoObject>(serializedOwner);
    }

    [Test]
    public void InvalidCastException()
    {
        var duckType = ImpromptuDictionary.Create<IOwner>(dynamicOwner);
        Assert.That(duckType.Pet, Is.EqualTo(owner.Pet)); // System.InvalidCastException : Invalid cast from 'System.Int64' to 'JsonSerializationDemo.Pet'.
    }

    [Test]
    public void RuntimeBinderException()
    {
        var duckType = dynamicOwner.ActLike<IOwner>();
        Assert.That(duckType.Pet, Is.EqualTo(owner.Pet)); // Microsoft.CSharp.RuntimeBinder.RuntimeBinderException : Cannot implicitly convert type 'long' to 'JsonSerializationDemo.Pet'. An explicit conversion exists (are you missing a cast?)
    }
}

有没有办法正确解决这个问题?

2 个答案:

答案 0 :(得分:1)

你的专栏:

 var duckType = ImpromptuDictionary.Create<IOwner>(dynamicOwner);

应该有效,但是在ImpromptuInterface中有一个特别是Enums的错误,现在是fixed in version 6.0。 ImpromptuDictionary尝试了几种在运行时强制类型的方法,并且对Enums使用了错误的方法。所以它现在有效。

答案 1 :(得分:0)

我认为,问题源于事实,Json serialiser将枚举序列化为数字。但是当它将它反序列化为expando对象时,它就不可能知道该属性实际上是一个枚举。这会在expando对象中生成整数值。

这会使即兴接口混淆并导致转换代理中的异常。我认为这可以在这里解决,代理构建器将检查目标类型是否为枚举,并使用in en的工作转换。但是你应该把它to official page。我认为不能解决这个问题。

相关问题