【问题标题】:Implement nested interface of generic parent class with ironpython用ironpython实现泛型父类的嵌套接口
【发布时间】:2013-04-27 11:48:51
【问题描述】:

我不想用 IronPython 实现以下 C#/.Net 接口:

public static class Consumes<TMessage> where TMessage : class
{
   public interface All
   {
       void Consume(TMessage message);
   }
}

这是我目前尝试的python代码:

class TestMessage(object):
     pass

class TestConsumer(Consumes[TestMessage].All):
     def Consume(self, message):
         pass

由此我得到以下异常:

TypeError:TestConsumer:无法从打开的通用实例化 MassTransit.Consumes`1+All[TMessage] 继承。仅支持关闭的实例化。

实现此接口的有效 C# 类定义如下所示:

public class TestConsumer : Consumes<TestMessage>.All
{
    public void Consume(TestMessage msg) { }
}

那么是不是不可能在 IronPython 中实现这种功能?还是我做错了?

提前谢谢你!

【问题讨论】:

  • 您能否提供 IConsumer 或将其从您的示例中删除。我不认为它是相关的,但谁知道呢。
  • 删除它。它只是 Masstransit 内部使用的一个空标记界面。谢谢你的提示!

标签: c# generics ironpython masstransit


【解决方案1】:

看起来像实现嵌套接口为

class TestConsumer(Consumes[TestMessage].All):

没有正确绑定类型参数TMessage,即使这是语法所期望的。 如果最后提供了类型(“用于接口而不是周围的类”),它似乎可以按预期工作:

class TestConsumer(Consumes.All[TestMessage]):

同样可行的是显式导入接口All 并像使用独立的通用接口一样使用它:

from MyLib.Consumes import All
class TestConsumer(All[TestMessage]):

这种行为是否正确/以这种方式定义或者type generation 中是否存在错误(除了“inhert”-typo 之外)或通用参数的定义/绑定方式似乎并不明显。似乎也可以接受两次绑定参数:

class PyTestConsumer(Consumes[String].All[String]):

即使使用不同的值,从 .NET 的角度来看也没有多大意义:

class PyTestConsumer(Consumes[List[String]].All[String]):

【讨论】:

  • 所以,如果我理解正确的话,这是当前 IronPython 类型生成 impl 中的一个错误。并且无法实现泛型类中的嵌套接口。不幸的是,我无法更改第 3 方代码中的类或接口。无论如何,谢谢您的有根据的回答!
  • 不,我推测可能存在错误。我的第二个和第三个类定义代码 sn-ps 应该允许您为您的用例实现All-interface。
  • 啊,好吧,所以我认为这是一个错误。但正如您所建议的,第二个和第三个解决方案有效。
  • 还有一个有趣的提示:我知道不要直接在 python-script 中实现接口,而是使用github.com/ekonbenefits/impromptu-interface 将定义正确方法和属性的脚本范围转换为生成实现 .Net 接口的动态代理。
猜你喜欢
  • 2023-02-09
  • 2019-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-25
  • 1970-01-01
相关资源
最近更新 更多