C# - 动态关键字和接口实现

发布于 2024-08-31 16:50:50 字数 472 浏览 9 评论 0原文

我假设这是不可能的,但在进一步挖掘之前,有没有办法做这样的事情:

public void ProcessInterface(ISomeInterface obj) {}

//...

dynamic myDyn = GetDynamic<ISomeInterface>() 
ProcessInterface(myDyn);

我看到了 post 争论它,但听起来它没有包含在内。

一些上下文:通过 COM 公开的 .Net 程序集 -> Silverlight 应用程序使用接口实现类。通过接口引用对象会很好。真没想到,原来的目的是这样的……

I'm assuming this isn't possible but before digging further is there a way to do something like this:

public void ProcessInterface(ISomeInterface obj) {}

//...

dynamic myDyn = GetDynamic<ISomeInterface>() 
ProcessInterface(myDyn);

I've seen a post arguing for it but it sounds like it wasn't included.

A little context: .Net assembly exposed through COM -> Silverlight app consuming interface-implementing classes. Would be nice to refer to the objects by interface. I really don't expect that this was what was intended...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

哽咽笑 2024-09-07 16:50:50

不,dynamic 不会使类型假装实现接口(即使它通过 dynamic 拥有所有方法)。将其传递给ProcessInterface本质上会消除动态

动态 取决于调用代码,就像实现对象一样。更多,甚至。

然而,您可以创建一个使用鸭子类型的接口包装器:

class Foo : IBar {
    readonly dynamic duck;
    public Foo(dynamic duck) { this.duck = duck; }

    void IBar.SomeMethod(int arg) {
        duck.SomeMethod(arg);
    }
    string IBar.SomeOtherMethod() {
        return duck.SomeOtherMethod();
    }
}
interface IBar {
    void SomeMethod(int arg);
    string SomeOtherMethod();
}

No, dynamic won't make a type pretend to implement an interface (even if it has, via dynamic, all the methods). Passing it to ProcessInterface essentially takes away the dynamic.

dynamic depends on the calling code just as much as the implementing object. More, even.

You could however make an interface wrapper that uses duck typing:

class Foo : IBar {
    readonly dynamic duck;
    public Foo(dynamic duck) { this.duck = duck; }

    void IBar.SomeMethod(int arg) {
        duck.SomeMethod(arg);
    }
    string IBar.SomeOtherMethod() {
        return duck.SomeOtherMethod();
    }
}
interface IBar {
    void SomeMethod(int arg);
    string SomeOtherMethod();
}
反差帅 2024-09-07 16:50:50

我想我不明白你的意思。如果您知道要处理的确切接口,为什么需要使用dynamic

I don't think I understand your point. If you know the exact interface you're be dealing with, why do you need to use dynamic?

月棠 2024-09-07 16:50:50

您可以使用开源Impromptu-Interface 来执行此操作。这是一种创建接口包装器并使用 DLR 的自动化方法。 Impromptu.ActLike(myDyn)

You can use the opensource Impromptu-Interface to do this. It's an automated way to make a interface wrapper and uses the DLR. Impromptu.ActLike<ISomeInterface>(myDyn)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文