2010-09-07 11 views
5

Czy ktoś wie, czy można wywołać metodę obiektu CLR za pośrednictwem indeksu przy użyciu funkcji dynamicznego języka? Na przykład: myClrObj["SuperMethod"](), którą mogę łatwo zrobić w javascript.Dynamiczny indeksator C#

z góry.

Odpowiedz

1

Nie może być lepsze sposoby, ale jeden sposób, że wiem, jak to zrobić jest:

  • utworzyć klasę, która dziedziczy z DynamicObject
  • ręcznym odpowiednia metoda, aby uchwycić dostęp przez indekser
  • Skonfiguruj i buforuj delegata, który odpowiada znalezionej metodzie za pomocą dostarczonego argumentu indeksera:
  • Podaj metodę rozszerzenia, która odpowiednio sprawi, że obiekt będzie wyglądał dynamicznie, z poprawną specjalizacją DynamicObject acja utworzona.

    dynamic obj = myObj.AsIndexedObj(); obj["Do"]();

+0

Świetny pomysł, ale nie nadaje się. Mam istniejące klasy, które nie są pochodnymi dynamicznymi. – AndrewG

+0

Nie musisz wyprowadzać swoich obiektów z DynamicObject. Zamiast tego utwórz coś w rodzaju adaptera, który dynamicznie współdziała w imieniu oryginalnego obiektu. Ma to tę zaletę, że staje się wielokrotnego użytku dla wielu typów obiektów – flq

0

Można użyć ImpromptuInterfsce dostępny poprzez Nuget, owija API DLR aby uprościć dynamicznie wywołać metodę według nazwy, pracuje dla obu obiektów dynamicznych i poco. Szybciej niż odbicie dla obiektów poco.

Impromptu.InvokeMember(myClrObj,"SuperMethod")