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

5

如果我有

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

struct B {}
struct C {}

我有一个typeof(A)

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

有没有一种很好的反射方式来做到这一点?


2
通过使用Type.GetFieldsType.GetProperties(或Type.GetMembers)等方法,获取类型A的所有成员很容易。但是确定一个方法内部使用了哪些类型?就不太确定了。 - Chris Sinclair
你需要在运行时使用吗?你有代码访问权限,还是只有类型? - Martin1921
类似的SO问题:https://dev59.com/xUvSa4cB1Zd3GeqPbArA - S2S2
1个回答

8
你需要查看MethodBody类(链接中有一个非常好的使用示例)。这将使你能够编写以下代码:
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!");
}

抱歉如果帖子表述不清楚。我不想知道B和C的存在。如果A也使用D,我也想知道这一点。 - Lucas Meijer
正如你在代码中看到的那样,mb.LocalVariables 返回方法使用的所有类型的列表。这应该恰好是你需要发现它是否使用了 B、C、D 或甚至 Z 的方式。 - RB.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接