Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用反射确定c#中某个类型使用的所有类型_C#_Reflection - Fatal编程技术网

使用反射确定c#中某个类型使用的所有类型

使用反射确定c#中某个类型使用的所有类型,c#,reflection,C#,Reflection,如果我有 class A { public void DoStuff() { B b; } } struct B {} struct C {} 我有(A)的类型 我想获得a使用的所有类型的列表。在这种情况下,它将是typeof(B),而不是typeof(C) 有没有一种很好的方法可以通过反射来实现这一点?您需要查看这个类(链接中有一个很好的例子说明它的用途)。这将允许您编写如下代码: MethodInfo mi = typeof(A).GetMethod("Do

如果我有

class A
{
   public void DoStuff()
   {
      B b;
   }
}

struct B {}
struct C {}
我有(A)的
类型

我想获得a使用的所有类型的列表。在这种情况下,它将是
typeof(B)
,而不是
typeof(C)

有没有一种很好的方法可以通过反射来实现这一点?

您需要查看这个类(链接中有一个很好的例子说明它的用途)。这将允许您编写如下代码:

MethodInfo mi = typeof(A).GetMethod("DoStuff");
MethodBody mb = mi.GetMethodBody();
foreach (LocalVariableInfo lvi in mb.LocalVariables)
{
    if (lvi.LocalType == typeof(B))
        Console.WriteLine("It uses a B!");
    if (lvi.LocalType == typeof(C))
        Console.WriteLine("It uses a C!");
}

通过
Type.GetFields
Type.GetProperties
(或
Type.GetMembers
)等等,很容易获得
A
的所有类型的成员。但是要弄清楚在一个方法中本地使用的是什么类型?不太确定。你在运行时需要这个吗?你有权访问代码,还是只有类型?类似的SO问题:如果文章中不清楚,很抱歉。我不想知道B和C存在的事实。如果A也使用D,我也希望找到它。正如您在我的代码中看到的,mb.LocalVariables返回该方法使用的所有类型的列表。如果它使用B、C、D甚至Z,那么这正是您需要发现的。