【问题标题】:How to call an indexer on a C# class from PowerShell?如何从 PowerShell 调用 C# 类的索引器?
【发布时间】:2010-11-10 22:47:55
【问题描述】:

我无法弄清楚如何让 Powershell 调用我班级的索引器。该类看起来像这样(大大简化):

public interface IIntCounters
{
    int this[string counterName] { get; set; }
}

public class MyClass : IIntCounters
{
    public IIntCounters Counters { get { return this; } }

    int IIntCounters.this[string counterName]
        { get { ...return something... } }
}

如果我新建这个类,我不能只在它上面使用方括号运算符 - 我会收到“无法索引”错误。我还尝试使用 get_item(),这是 Reflector 向我展示的索引器最终在程序集中的样子,但这让我出现“不包含名为 get_item 的方法”的错误。

更新:这似乎特定于我使用显式接口。所以我的新问题是:有没有办法让 Powershell 在不切换显式接口的情况下查看索引器? (如果可能的话,我真的不想修改这个程序集。)

【问题讨论】:

    标签: c# powershell


    【解决方案1】:

    这对我有用(使用反射):

    $obj = new-object MyClass
    $p = [IIntCounters].GetProperty("Item")
    $p.GetValue($obj, @("counterName"))
    

    【讨论】:

      【解决方案2】:

      我还没有尝试过,但它似乎应该可以工作:

      $obj = new-object MyClass
      $counters = [IIntCounters]$obj
      $counters['countername']
      

      (好吧,我玩了一点,我不再认为这可能有效,但仍然值得一试。)

      【讨论】:

      • 是的,这与 $obj.Counters['countername'].. 不工作几乎相同。 :(
      • 我认为它可能起作用的原因是显式实现的接口只能通过对接口的引用访问,而不是通过对实现类的引用。不幸的是,当您将类引用转换为接口引用时,PowerShell 仍将其视为对最派生类的引用。
      • 对,但是调用'Counters'会返回一个IIntCounters,它是对接口的引用,而不是对类的引用。不过,您的观点很有趣,关于通过接口查看类本身的豪华。如果它总是反映在引用上以找到下面的真正具体对象,那么这可能解释了这个问题。嗯..也许能够安装包装显式接口索引器的新方法..
      猜你喜欢
      • 2010-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-26
      • 1970-01-01
      • 1970-01-01
      • 2022-01-02
      相关资源
      最近更新 更多