Ze świata PHP postanowiłem spróbować C #. Szukałem, ale nie mogę znaleźć odpowiedzi, jak zrobić odpowiednik tego.
$object = new Object();
$vars = get_class_vars(get_class($object));
foreach($vars as $var)
{
doSomething($object->$var);
}
Zasadniczo mam listę obiektu. Obiekt może być jednym z trzech różnych typów i będzie miał zestaw właściwości publicznych. Chcę mieć możliwość uzyskania listy właściwości obiektu, zapętlenia nad nimi, a następnie zapisania ich do pliku. Myślę, że ma to coś wspólnego z odbiciem C #, ale to wszystko jest dla mnie nowe.
Każda pomoc byłaby bardzo mile widziana.
c#
reflection
m4rc
źródło
źródło
Odpowiedzi:
To powinno wystarczyć:
źródło
System.Reflection
nazwPropertyInfo[] props = input.GetType().GetProperties();
Newtonsoft.Json.JsonConvert
?źródło
Tak, Refleksja byłaby właściwą drogą. Po pierwsze, otrzymasz,
Type
który reprezentuje typ (w czasie wykonywania) instancji na liście. Możesz to zrobić, wywołującGetType
metodęObject
. Ponieważ znajduje się wObject
klasie, jest wywoływany przez każdy obiekt w .NET, ponieważ wszystkie typy pochodzą zObject
( no, technicznie nie wszystko , ale to nie jest ważne).Gdy masz już
Type
instancję, możesz wywołaćGetProperties
metodę, aby uzyskaćPropertyInfo
instancje, które reprezentują informacje w czasie wykonywania o właściwościach wType
.Uwaga, można skorzystać z przeciążeniem
GetProperties
ułatwia klasyfikowanie której właściwości mają odzyskać.Stamtąd po prostu zapisujesz informacje do pliku.
Twój powyższy kod, przetłumaczony, wyglądałby tak:
Zauważ, że jeśli chcesz uzyskać informacje metoda lub informacji pole, trzeba by zadzwonić do jednego z tych przeciążeń
GetMethods
lubGetFields
metod odpowiednio.Zauważ też, że jedną rzeczą jest wyszczególnienie członków pliku, ale nie powinieneś używać tych informacji do sterowania logiką opartą na zestawach właściwości.
Zakładając, że masz kontrolę nad implementacjami typów, powinieneś wyprowadzić ze wspólnej klasy bazowej lub zaimplementować wspólny interfejs i wykonać na nich wywołania (możesz użyć operatora
as
lubis
, aby pomóc określić, z którą klasą bazową / interfejsem pracujesz runtime).Jeśli jednak nie kontrolujesz tych definicji typów i musisz sterować logiką opartą na dopasowywaniu wzorców, to jest w porządku.
źródło
cóż, w C # jest podobnie. Oto jeden z najprostszych przykładów (tylko dla usług publicznych):
źródło
Aby uzyskać określoną wartość właściwości z nazwy właściwości
aby uzyskać dostęp do wartości właściwości Name z ciągu nazwa właściwości
źródło
Możesz użyć GetType - GetProperties - Linq Foreach :
źródło
Rozwiązanie jednoprzewodowe wykorzystujące Linq ...
źródło
Oto coś, czego używam do przekształcenia an
IEnumerable<T>
w a,DataTable
które zawiera kolumny reprezentująceT
właściwości, z jednym wierszem na każdy element wIEnumerable
:Jest to „nieco” przesadnie skomplikowane, ale w rzeczywistości jest całkiem dobre, aby zobaczyć, jaki jest wynik, ponieważ możesz dać mu
List<T>
na przykład:Zostanie Ci zwrócony DataTable o strukturze:
Z jednym wierszem na element w pliku
List<Car>
źródło
Ten przykład przycina wszystkie właściwości ciągu obiektu.
źródło
Nie znalazłem tego do pracy, powiedzmy obiekty aplikacji. Miałem jednak sukces z
źródło
źródło
źródło
Możesz spróbować tego:
Gdy każda tablica implementuje interfejs IEnumerable
źródło