【问题标题】:How to access proxied object using impromptu-interface如何使用即兴接口访问代理对象
【发布时间】:2016-04-04 10:40:53
【问题描述】:

使用impromptu-interface 时如何访问 Duck Typed 代理对象。考虑我的代码,该代码说明了我的示例,当我尝试将 Duck Typed Object 强制转换为代理对象时,我得到了 InvalidCastException

using System;
using ImpromptuInterface;

namespace ConsoleApplication1
{
    public class Duck
    {
        public string Says { get; set; }

        public int GetNumberOfQuacksPerMinute()
        {
            return 42;
        }
    }

    public interface IPondBird
    {
        string Says { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            // Duck says Quack! Quack!! Quack!!!
            var thing = new Duck { Says = "Quack! Quack!! Quack!!!" };

            IPondBird myInterface = Impromptu.ActLike(thing);

            // ...

            // Later on, I want to get access to a proxied object, but I 
            // get a InvalidCastException here
            Duck proxiedObject = (Duck) myInterface;
            Console.WriteLine("Duck # quacks per minute: " 
                + proxiedObject.GetNumberOfQuacksPerMinute());
        }
    }
}

异常如下:

发生“System.InvalidCastException”类型的未处理异常 在 ConsoleApplication1.exe 中

附加信息:无法转换类型的对象 'ActLike_IPondBird_c7dd53902ec74f01a3844d4789244ea3' 输入 'ConsoleApplication1.Duck'。

【问题讨论】:

  • 您能否展示文档中使您相信这应该有效的部分?这里有一个误解,文档让我更容易向你解释。
  • 看起来您可以使用Impromptu.UndoActLike(myInterface) 来取回原始(包装的)对象。
  • @PieterWitvoet 这也有效,谢谢!

标签: c# impromptu-interface


【解决方案1】:

你不能。你可以考虑一下线

IPondBird myInterface = Impromptu.ActLike(thing);

有点像

public class Wrapper : IPondBird 
{
  public Wrapper(Duck duck) { ... }
}
IPondBird myInterface = new Wrapper(thing);

话虽如此,您可以将对本机对象的引用作为合同本身的一部分 - 例如:

public interface IPondBird
{
    string Says { get; set; }
    object NativeObject { get; }
}

public class Duck
{
    public string Says { get; set; }

    public int GetNumberOfQuacksPerMinute()
    {
        return 42;
    }

    public object NativeObject { get { return this; } }
}

IPondBird myInterface = Impromptu.ActLike(thing);   
var duck = (Duck)myInterface.NativeObject;

【讨论】:

  • 优秀的答案,现在测试它,它工作得很好。好吧,回到池塘...... :)
【解决方案2】:

当您使用即兴接口时,生成的代理始终具有IActLikeProxy 的显式接口实现。

IPondBird myInterface = Impromptu.ActLike(thing);   
var duck = (Duck)((IActLikeProxy)myInterface).Original;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-17
    • 1970-01-01
    • 1970-01-01
    • 2015-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多