【问题标题】:How to identify each parameter type in a C# method?如何识别 C# 方法中的每个参数类型?
【发布时间】:2011-06-03 16:10:36
【问题描述】:

我有一个 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

}

编辑:这是我的代码的一部分,用于创建属性网格类型的页面,我想在其中显示带有所选方法的数据类型的参数列表。如果参数有任何用户定义的类型/引用类型,那么我想进一步扩展它以显示它下面的所有元素和数据类型。

【问题讨论】:

  • 你到底想对复杂类型参数做什么?
  • 你有一个比这更大的问题,你将如何生成正确的来进行调用?想一想,答案就会浮出水面。查看 dynamic 关键字。
  • @mace,基本上,我正在尝试创建一个属性页面之类的东西,页面应该显示参数和类型。如果它是像 MyComplexType 这样的引用类型,那么我将扩展该类型以在其中查找其他类型。如果它不是像 int、string 或 color 这样的引用类型,那么我不需要检查它。希望你明白我的意思。

标签: c# reflection methods types


【解决方案1】:

利用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 后检查您可以使用 David 提到的 IsPrimitiveIsByRef。另外你也可以使用IsValueTypeSystem.Type 类中有大量 Is* 属性。最好的办法是检查每个 Is* 属性的 MSDN 文档,即...IsClass states...

获取一个值,指示是否 类型是一个类;也就是说,不是一个值 类型或接口。

因此可以推断IsValueType 不需要被调用。请记住,给定类型可以在多个属性中返回 true,因为 IsClass 可以返回 true 并且 IsPassByRef 可以返回 true。也许为已知的 CLR 类型提供逻辑,因为它们不会更改,并且您提前知道这些,然后为用户定义的复杂类型构建逻辑。您也可以采用构建逻辑的方法为 CLR 类型执行此操作;无论哪种方式都可以。

【讨论】:

  • 我能够得到参数的类型。现在我将如何识别每种类型……它是引用类型、值类型还是原始类型?我想要一个通用代码来为传递给它的任何方法执行此操作。
  • ParameterType 返回一个 System.Type,它有一个名为 IsByRef 的属性(告诉您它是否是引用类型)和另一个名为 IsPrimitive 的属性。
  • @user465876 添加了 David 提到的附加评论以及对 IsValueType 的引用
  • @Dave,Aaron,感谢您的回复。我想这行不通。我比较了 Int32、String、Color、MyComplexType/MyClass 的属性,结果不是很有帮助。 Int32 和 Color 具有 IsValueType=true、IsPrimitive=true、IsClass=False 和 IsByRef=false。对于 String、MycomplexType/MyClass,它是 IsValueType=false、IsPrimitive=false、IsClass=true 和 IsByRef=false。即使我提出了上述所有这些条件,我也很担心,如何确保它适用于用户在方法中定义的每种类型?我无法检查每种类型。属性属性可以以任何方式提供帮助吗?
  • @user465876 在帖子中添加了额外的评论...归结为利用 Is* 属性来定义每种类型应采用的后勤路径。
【解决方案2】:

要获取参数的实际Type,请在ParameterInfo 值上使用ParameterType。使用该值,您可以通过多种方式使用它来识别类型。最简单的方法是直接与已知类型进行比较

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

或者在类型不可用的情况下,可以使用名称匹配(尽管这有点不稳定,因为重构操作可能会丢失字符串常量并静默地破坏应用程序)

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

【讨论】:

  • 这种方式将限制我为任何方法制作通用代码。或者我必须检查 C# 中存在的每一种类型。我想要一种通用的方法来动态检查参数类型。
  • @user465876 如果您只关心原始,那么只需使用IsPrimitive 属性。
  • 我想我可以正确解释。实际上,我想编写一个通用代码,它将读取方法名称并获取所有参数,然后将它们写入具有其类型的页面中。如果类型是引用类型(用户定义),那么它应该进一步扩展它以检查其中的类型并将其写入页面。类似于属性网格的东西。我关心每一种类型,以便知道应该扩展哪种类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多