【问题标题】:calling specific property overload in C# from Python从 Python 调用 C# 中的特定属性重载
【发布时间】:2016-12-28 04:34:58
【问题描述】:

我试图从 IronPython 中调用用 C# 构造的对象的特定属性重载(不是方法重载)。以下是两个可用的重载:

当我这样称呼它时:

famInst.FromRoom

它返回一个对象IronPython.Runtime.Types.ReflectedIndexer。当我尝试使用 Overloads 时,它会引发异常:

famInst.FromRoom.Overloads[]()

它抛出异常"unexpected object "]""

有没有办法为这个属性指定重载?

【问题讨论】:

标签: c# python


【解决方案1】:

C# 中不存在属性重载之类的东西。您所询问的内容称为索引器。下面是一个索引器的例子:

public class Foo
{
    SomeObject this[int index]
    {
        // The get accessor.
        get
        {
            // return the value specified by index
        }

        // The set accessor.
        set
        {
            // set the value specified by index
        }
    }
}

这意味着我可以将Foo 视为一个数组,如下所示:

var f1 = new Foo();
SomeObject someObj = f1[1];

在你的情况下,文档有这个:

public Room this[
    Phase phase
] { get; }

这意味着FamilyInstance 有一个索引器,它接受Phase 实例并返回Room。所以你会这样使用它:

// If phase is abstract then new the concrete type. I am not familiar with revit API
var somePhase = new Phase(); 
famInst[somePhase];

或者,因为它是一个命名的索引器,你可以这样做:

famInst.FromRoom[somePhase];

另一个是普通属性,记录如下:

public Room FromRoom { get; }

您只能访问该属性,但不能这样设置:

Room room = famInst.FromRoom;

基本上,索引器允许您将类视为数组,即使该类不是数组。在这种情况下,FamilyInstance 可以被视为一个数组。 .NET 中有很多类型都有索引器,例如,String 有一个这样的索引器:

public char this[int index] { get; }

它接受一个它并在该索引处返回一个char,或者如果该索引超出范围,它会引发异常。

【讨论】:

  • 所以你说的是我错了,假设有两 (2) 种方法可以访问 FromRoom 属性。只有一个要求我输入 Phase 作为索引参数,如下所示:famInst.FromRoom[phase]。为什么文档中列出了其中两个?这让我很困惑。
  • 不,你是对的。其中之一是返回Room 的属性。另一个是索引器,它采用“相位”并返回Room。在我的代码中,我向您展示了如何访问带有 Phase 的代码
  • 关于如何调用另一个的任何想法?因为它只允许我调用索引器之一。如果您能回答,我很乐意为您提供答案。
  • 我不明白你的意思,这里有两种方法:1.Room room = famInst.FromRoom; 2.Room room = famInst.FromRoom[somePhase];
  • 如果您阅读了我的问题,它指出当我调用 famInst.FromRoom 时,它会返回一个 ReflectedIndexer,唯一有效的方法是当我实际使用带有 Phase 输入的第二种方法时。为什么它会返回一个反射索引器?那是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-03
相关资源
最近更新 更多