使用反射获取字段初始化程序中使用的 ctor 参数

Get ctor argument used in field's initializer using reflection

我的程序集有多个 classes,它们有这样的字段:

private static Foo MyFoo = new Foo(typeof(Bar));

每个 class 的参数 typeof(Bar) 不同。

在我的单元测试中,我需要动态提取该参数。

我可以找到所有 classes,并筛选出具有静态 Foo 字段的那些。然后我有一个 FieldInfo.

但是我不知道如何得到那个参数的类型?

Reflection 为您提供了与程序集关联的元数据。不是您要求的运行时值。

除非您检查 IL,否则使用反射 API 不可能实现您的要求。您可以使用 Mono.Cecil 或类似的库来检查 IL。

顺便说一句,如果您解释一下您要测试的内容,就会很容易回答。我相信您可以轻松测试 MyFoo.SomeProperty == typeof(Bar),因为 Foo 将构造函数参数公开为某些 属性.

查找 MethodBodyReader您可以使用它来查看 IL 并在那里获取构造函数参数的类型。

https://github.com/jbevain/mono.reflection/blob/master/Mono.Reflection/MethodBodyReader.cs

您可以使用 FieldInfo.GetValue 来获取 static 的值。

foreach (var foo in foos) {
  var myfoo = foo.GetFields(BindingFlags.Static).Single(fieldinfo =>  fieldinfo.FieldType == typeof(Foo));
  Foo foo = (Foo) myfoo.GetValue(null);
}

现在假设 Foo 看起来像:

public Type AType {get; set; }
public void Foo(Type t) { AType = t; }

然后

Foo foo = (Foo) myfoo.GetValue(null);
Type fooType = foo.AType;