2010-11-10 3 views
7

Ich habe Probleme herauszufinden, wie Powershell einen Indexer für meine Klasse aufrufen kann. Die Klasse sieht wie folgt aus etwas (stark vereinfacht):Wie Sie einen Indexer für eine C# -Klasse von PowerShell aufrufen?

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... } } 
} 

Wenn ich diese Klasse neu kann ich nicht nur eckigen Klammern auf sie verwenden - ich Fehler einen „Index nicht in der Lage“ zu bekommen. Ich habe auch versucht, mit get_item(), was Reflector zeigt mir der Indexer wird schließlich in der Assembly, aber das bringt mir eine "enthält keine Methode namens get_item" Fehler.

UPDATE: dies scheint spezifisch für meine Verwendung von expliziten Schnittstellen. Meine neue Frage lautet also: Gibt es eine Möglichkeit, Powershell den Indexer zu zeigen, ohne von expliziten Schnittstellen abzuweichen? (Ich möchte wirklich nicht, diese Versammlung, wenn möglich ändern.)

Antwort

4

Dies funktioniert für mich (verwendet Reflektion.):

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

Yup! – scobi

2

ich nicht versucht, aber es scheint, wie es funktionieren soll:

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

(OK, ich spielte ein wenig um und ich denke, dass dies nicht mehr wahrscheinlich zu arbeiten, aber es kann immer noch einen Versuch wert)

+0

Ja, das ist so ziemlich die gleiche wie $ obj.Counters ['Gegenname'] .. funktioniert nicht. :( – scobi

+2

Der Grund, warum ich dachte, dass es funktionieren könnte, ist, dass explizit implementierte Schnittstellen nur über einen Verweis auf die Schnittstelle zugänglich sind, nicht über einen Verweis auf die implementierende Klasse. Wenn Sie eine Klassenreferenz auf eine Schnittstellenreferenz anwenden, sieht PowerShell leider immer noch aus als Referenz auf die am weitesten abgeleitete Klasse – OldFart

+0

Richtig, aber 'Counters' ruft einen IIntCounters zurück, der eine Referenz auf die Schnittstelle und nicht die Klasse ist.Ihr Punkt ist interessant, wenn Sie über die Schnittstelle zur Klasse selbst schauen Wenn es sich jedoch immer auf Referenzen bezieht, um das wahre konkrete Objekt darunter zu finden, dann könnte das dieses Problem erklären. Hm..könnte in der Lage sein, neue Methoden zu installieren, die die expliziten Interface-Indexer einhüllen .. – scobi

Verwandte Themen