给出以下代码:
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?)
}
}
有没有办法正确解决这个问题?
答案 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。我认为不能解决这个问题。