2011-01-04 15 views
5

Mam metoda C# powiedzieć:Jak rozpoznać każdy typ parametru w metodzie C#?

MyMethod(int num, string name, Color color, MyComplexType complex) 

Korzystanie refleksji, w jaki sposób można wyraźnie zidentyfikować każdego z typów parametrów dowolnej metody? Chcę wykonać pewne zadanie według typu parametru. Jeśli typ jest prosty int, string lub boolean to robię coś, jeśli jest to Color, XMLDocument, itp. Robię coś innego i jeśli jest to typ zdefiniowany przez użytkownika jak MyComplexType lub MyCalci itp., To chcę wykonać pewne zadanie.

Jestem w stanie pobrać wszystkie parametry metody przy użyciu parametru ParameterInfo i mogę przechodzić przez każdy parametr i uzyskać ich typy. Ale w jaki sposób mogę zidentyfikować każdy typ danych?

foreach (var parameter in parameters) 
{ 
    //identify primitive types?? 
    //identify value types 
    //identify reference types 

} 

Edit: to oprócz mojego kodu do stworzenia propert siatki rodzaju strony, na której chcę pokazać listę parametrów z typów danych dla wybranej metody. Jeśli parametr ma zdefiniowany przez użytkownika typ/typ odniesienia, to chcę go rozszerzyć, aby pokazać wszystkie elementy pod nim z typami danych.

+0

Co dokładnie chcesz zrobić z parametrem złożonym? –

+0

Masz * znacznie * większy problem niż to, w jaki sposób wygenerujesz właściwą * wartość *, aby wykonać połączenie? Przemyśl to i odpowiedz wyjdzie. Spójrz na słowo kluczowe * dynamic *. –

+0

@mace, w zasadzie, próbuję utworzyć rzecz strony rodzaju rzeczy, gdzie strona powinna pokazać parametry i typ. Jeśli jest to typ odniesienia, na przykład MyComplexType, to rozwijam ten typ, aby znaleźć inny typ w nim.Jeśli nie jest to typ odniesienia, taki jak int, string lub color, nie muszę sprawdzać w nim. Mam nadzieję, że masz to, co mam na myśli. –

Odpowiedz

10

użycie Marka ParameterInfo.ParameterType

using System; 
using System.Reflection; 

class parminfo 
{ 
    public static void mymethod (
     int int1m, out string str2m, ref string str3m) 
    { 
     str2m = "in mymethod"; 
    } 

    public static int Main(string[] args) 
    { 
     Console.WriteLine("\nReflection.Parameterinfo"); 

     //Get the ParameterInfo parameter of a function. 

     //Get the type. 
     Type Mytype = Type.GetType("parminfo"); 

     //Get and display the method. 
     MethodBase Mymethodbase = Mytype.GetMethod("mymethod"); 
     Console.Write("\nMymethodbase = " + Mymethodbase); 

     //Get the ParameterInfo array. 
     ParameterInfo[]Myarray = Mymethodbase.GetParameters(); 

     //Get and display the ParameterInfo of each parameter. 
     foreach (ParameterInfo Myparam in Myarray) 
     { 
      Console.Write ("\nFor parameter # " + Myparam.Position 
      + ", the ParameterType is - " + Myparam.ParameterType); 
     } 
     return 0; 
    } 
} 

Jeśli trzeba sprawdzić System.Type po pobraniu można użyć IsPrimitive i IsByRef jak wspomniano przez Dawida. Ponadto można również użyć IsValueType. Istnieje znaczna liczba właściwości Is * w klasie System.Type. Najprościej byłoby sprawdzić w dokumentacji MSDN na każdy * Czy własność czyli ... IsClass Zjednoczone ...

Pobiera wartość wskazującą, czy typ jest klasą; to znaczy nie jest to typ lub interfejs wartości o wartości .

Dlatego można wywnioskować, że IsValueType nie musi być wywoływany. Należy pamiętać, że dany typ może zwracać wartość true dla wielu właściwości, dzięki czemu IsClass może zwrócić wartość true, a IsPassByRef może zwrócić wartość true. Być może zapewnij logikę dla znanych typów CLR, ponieważ te nie ulegną zmianie i znasz te z wyprzedzeniem, a następnie wbudujesz logikę dla typów złożonych zdefiniowanych przez użytkownika. Możesz zastosować podejście budowania w logice, aby zrobić to również dla typów CLR; tak czy inaczej by działało.

+0

Udało mi się uzyskać typ parametru. Jak rozpoznać każdy typ? Czy jest to typ odniesienia, typ wartości czy typ pierwotny? Chcę generic kodu, aby zrobić to dla jakiejkolwiek metody przekazanej do niego. –

+0

Parametr Typ zwraca typ System.Type, który ma właściwość o nazwie IsByRef (mówi, czy jest to typ odniesienia) i drugi o nazwie IsPrimitive. –

+0

@ user465876 Dodany dodatkowy komentarz, o którym wspominał David, a ponadto odniesienie do IsValueType –

2

Aby uzyskać faktyczny Type parametru, należy użyć wartości ParameterType dla wartości ParameterInfo. Przy tej wartości można go użyć na kilka sposobów do identyfikacji typu. Najprostszym jest z bezpośrednim porównaniu do znanego typu

if (parameter.ParameterType == typeof(int)) { 
    ... 
} 

lub w przypadkach, w których typ nie jest dostępny nazwę mecz może być używana (choć jest to nieco flakier jak operacje byłaby może przegapić ciąg stały i cicho przerwać aplikację)

if (parameter.ParameterType.Name == "TheTypeName") { 
    ... 
} 
+0

W ten sposób ograniczę się do generowania kodu dla dowolnej metody .. lub muszę sprawdzić dla każdego typu istniejącego w języku C#. Chciałbym mieć ogólny sposób sprawdzania typu parametru w locie. –

+0

@ user465876 jeśli chodzi o prymityw, to po prostu użyj właściwości 'IsPrimitive'. – JaredPar

+0

Myślę, że mógłbym wyjaśnić poprawnie. Właściwie chcę napisać ogólny kod, który odczyta nazwę metody i uzyskać wszystkie parametry, a następnie zapisać je na stronie z jego typem. Jeśli typ jest typem odniesienia (zdefiniowanym przez użytkownika), wówczas powinien go rozwinąć, aby sprawdzić typy w nim zawarte i zapisać je na stronie. Coś jak siatka własności. Dbam o każdy z tych typów, żeby wiedzieć, który z nich powinien być większy. –

Powiązane problemy