Czy można uzyskać dostęp do prywatnych zmiennych obiektu za pomocą metody rozszerzenia?Czy metody rozszerzania C# mogą uzyskać dostęp do zmiennych prywatnych?
Odpowiedz
Nie. Możesz zrobić to samo w metodzie rozszerzenia, jak w "normalnej" metodzie statycznej w niektórych klasach narzędzi.
Więc to rozszerzenie metoda
public static void SomeMethod(this string s)
{
// do something with 's'
}
jest równoznaczne z pewnym statycznej metody pomocnika tak (przynajmniej jeśli chodzi o to, co można uzyskać dostęp):
public static void SomeStringMethod(string s)
{
// do something with 's'
}
(Oczywiście można korzystać z niektórych odbicie w albo metodę uzyskiwania dostępu do prywatnych użytkowników, ale myślę, że nie o to pytam.)
Nie, chyba że dasz jakiś dostęp do nich poprzez publiczne wsparcie właściwości lub wzorzec proxy.
nr:
public class Foo
{
private string bar;
}
public static class FooExtensions
{
public static void Test(this Foo foo)
{
// Compile error here: Foo.bar is inaccessible due to its protection level
var bar = foo.bar;
}
}
metodę rozszerzenia jest przede wszystkim metoda statyczna więc wszystko masz dostęp do są publiczne członkowie przykład, w którym metoda rozszerzenie jest wywoływany na
Nie, nie mogę.
Będziesz jednak chciał wiedzieć, że inne odpowiedzi są nieprawidłowe, mówiąc, że normalne metody statyczne nie mogą uzyskać dostępu do prywatnych pól. Metoda statyczna może uzyskać dostęp do prywatnych niestatycznych pól elementów w swojej własnej klasie. Poniższy kod jest całkowicie poprawny i pokazuje metody statycznej dostępem prywatną murawę:
public class Foo
{
private bool _field;
public static bool GetField(Foo foo)
{
return foo._field;
}
}
... Teraz z powrotem do Twojego pytania. Możesz myśleć, że metoda rozszerzenia powinna być w stanie zrobić to samo, biorąc pod uwagę (nieistniejącą) "równoważność" ze statycznymi metodami, które istnieją w innych odpowiedziach. Jednak nie można zadeklarować metod rozszerzenia w klasie zagnieżdżonej. Więc jeśli spróbować wykonać następujące czynności:
public class Foo
{
private bool _field;
public static class Extensions
{
public static bool GetField(this Foo foo)
{
return foo._field;
}
}
}
dostaniesz błąd kompilacji mówiąc
Uwaga: co ciekawe, usunięcie słowa kluczowegometoda Rozszerzenie musi być zdefiniowana w klasie statycznej najwyższego poziomu; Rozszerzenia są zagnieżdżonymi klasami:
this
powoduje, że kod jest kompilowany poprawnie. Przyczyny tego są omówione tutaj:
doskonałość w inżynierii. – Fattie
Jeśli jesteś właścicielem klasy, które są rozciągające, ci zawsze zadeklarować klasę częściową, a następnie rozszerzyć klasę & mieć dostęp do wszystkich prywatnych członków w innym pliku ... Ale tak naprawdę nie używasz metod rozszerzenia.
użyć refleksji
Nie zalecany, ale można ewentualnie uzyskać dostęp do dowolnej zmiennej prywatnej dowolnego typu za pomocą innej metody rozszerzenie tak:
public static T GetFieldValue<T>(this object obj, string name) {
var field = obj.GetType().GetField(name, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
return (T)field?.GetValue(obj);
}
A następnie uzyskać dostęp do prywatnych pola z dowolnego typu:
Foo foo = new Foo();
string privateBar = foo.GetFieldValue<string>("_bar");
- 1. Dostęp do pól prywatnych
- 2. Metody rozszerzania C# - wywołanie zwrotne obiektu
- 3. C++: W jaki sposób publiczna statyczna funkcja członkowska może uzyskać dostęp do prywatnych zmiennych członków instancji?
- 4. Java - Czy należy uzyskać dostęp do prywatnych instancji zmiennych w konstruktorach za pomocą metody pobierających i ustawiających?
- 5. Jak mogę uzyskać dostęp do niektórych (prywatnych) właściwości obiektu?
- 6. Metody rozszerzania wyrażeń RDLC
- 7. C# standardy kodowania dla prywatnych zmiennych składowych
- 8. PowerMock dostęp prywatnych członków
- 9. Czy funkcja dekorowana może uzyskać dostęp do zmiennych dekoratora?
- 10. Jak uzyskać dostęp do metody statycznej w języku C#?
- 11. Dlaczego w klasach statycznych należy zdefiniować metody rozszerzania C#?
- 12. java.lang.IllegalAccessError: próbowałem uzyskać dostęp do metody
- 13. Dostęp do zmiennych statycznych
- 14. symulacji zmiennych prywatnych w Pythonie
- 15. C wskaźniki do zmiennych Matlab
- 16. Czy metody Cashusa strehibuf C++ mogą generować wyjątki?
- 17. Dostęp do prywatnych członków z PowerShell
- 18. Symfony2 Dostęp do zmiennych trasy
- 19. widget jQuery nie ma metody "rozszerzania"
- 20. Jak uzyskać dostęp do zmiennych klasowych z modułu?
- 21. Jak określić parametr dla ogólnej metody rozszerzania listy C#
- 22. Czy jest to dobra praktyka kodowania do używania gettera do uzyskiwania dostępu do prywatnych zmiennych instancji
- 23. Dlaczego Swift zezwala na dostęp do prywatnych zmiennych w tym samym pliku?
- 24. Jak uzyskać dostęp do zmiennych członkowskich w klasie ciągów STL?
- 25. Funkcja przyjaciela C++ nie może uzyskać dostępu do prywatnych członków.
- 26. AngularJs: Jak uzyskać dostęp do zmiennych globalnych poza kontrolerem?
- 27. Jak uzyskać dostęp do zmiennych Sass w komponencie Vue?
- 28. Czy dwa procesy mogą jednocześnie uzyskać dostęp do pamięci (: pamięci :) bazy danych sqlite?
- 29. WPF - Jak uzyskać dostęp do metody zadeklarowanej w App.xaml.cs?
- 30. Dostęp do zmiennych konfiguracyjnych Devise
+1. Na marginesie możesz mieć prywatne metody przedłużania; istnieje dobry artykuł na ten temat na http://odetocode.com/Blogs/scott/archive/2009/10/05/private-extension-methods.aspx Metody rozszerzeń mogą również uzyskać dostęp do prywatnych statycznych członków ich statycznej klasy narzędziowej. – TrueWill
Mimo że jest to oznaczane jako C#, dotyczy to dowolnego z języków .NET, które zapewniają obsługę metod rozszerzeń. –
@TrueWill - ale ponieważ muszą być typami statycznymi, nie-zagnieżdżonymi, nietypowymi, nie mogą tak naprawdę mieć prywatnego dostępu do żadnych * zmiennych * obiektu. "wewnętrzny" dostęp, na pewno - ale nie "prywatny". –