考虑下面的代码:如何在使用ImpromptuInterface时解决此枚举类型问题?
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?)
}
}
是否有办法妥善解决这个问题呢?
6.0绝对修复了第一次失败的测试。第二次失败的测试现在失败,并显示以下错误:Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:无法将类型'long'隐式转换为'Sandbox.ImpromptuInterfaceExample.Pet'。存在明确的转换(您是否缺少演员?)。这是否可以固定在您的目标上,或者这只是ActLike <>的不受支持的使用? –
我发现将原始类型从ExpandoObject更改为ImpromptuDictionary会使两个测试都通过。谢谢你更新到6.0,Jay。 –
是的ImpromptuDictionary做了上面的额外工作,并为转换做准备,单独由ActLike创建的接口代理期望结果匹配接口或者可以与implict转换。 – jbtule