Как определить каждый тип параметра в методе C #? - PullRequest
6 голосов
/ 05 января 2011

У меня есть метод C # сказать:

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

Используя отражение, как я могу четко идентифицировать каждый из типов параметров любого метода? Я хочу выполнить некоторую задачу по типу параметра. Если тип простой int, string или boolean, то я делаю что-то, если это Color, XMLDocument и т. Д. Я делаю что-то еще, и если это пользовательский тип, такой как MyComplexType или MyCalci и т. Д., То я хочу выполнить определенную задачу.

Я могу получить все параметры метода, используя ParameterInfo, и могу пройтись по каждому параметру и получить их типы. Но как я могу определить каждый тип данных?

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

}

Редактировать: это отдельно от моего кода, чтобы создать сортировочную страницу страницы, где я хочу показать список параметров с типами данных для выбранного метода. Если параметр имеет какой-либо определенный пользователем тип / ссылочный тип, то я хочу расширить его, чтобы показать все элементы под ним с типами данных.

Ответы [ 2 ]

12 голосов
/ 05 января 2011

Используйте 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;
    }
 }

Если вам нужно проверить System.Type после получения, вы можете использовать IsPrimitive и IsByRef, как упомянуто Дэвидом. Кроме того, вы также можете использовать IsValueType. В классе System.Type существует значительное количество свойств Is *. Лучше всего было бы проверить документацию MSDN по каждому свойству Is *, т.е. ... IsClass states ...

Получает значение, указывающее, является ли Тип это класс; то есть не значение тип или интерфейс.

Следовательно, можно сделать вывод, что IsValueType не нужно вызывать. Имейте в виду, что данный тип может возвращать true для нескольких свойств, так как IsClass может возвращать true, а IsPassByRef может возвращать true. Возможно, предоставьте логику для известных типов CLR, поскольку они не изменятся, и вы знаете их заранее, а затем встроите логику для сложных типов, как определено пользователем. Вы можете воспользоваться подходом построения логики, чтобы сделать это и для типов CLR; в любом случае будет работать.

2 голосов
/ 05 января 2011

Для получения фактического Type параметра используйте ParameterType для значения ParameterInfo.С этим значением есть несколько способов использовать его для определения типа.Самым простым является прямое сравнение с известным типом

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

. Или в случаях, когда тип недоступен, можно использовать сопоставление имени (хотя это немного более ненадежно, поскольку операции рефакторинга могут пропустить строковую константуи молча сломать приложение)

if (parameter.ParameterType.Name == "TheTypeName") {
  ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...