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

时间:2015-09-28 07:00:22

标签: c# reflection

我的程序集有多个类,其中包含以下字段:

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

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

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

我可以找到所有类,并过滤那些具有静态Foo字段的类。然后我有一个FieldInfo

但是我不知道如何获得该论点的类型?

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

您可以使用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;

答案 2 :(得分:0)

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

除非您检查IL,否则您使用Reflection API无法提出的问题。您可以使用Mono.Cecil或类似的库来检查IL。

不过,如果你解释一下你试图测试什么,那就很容易回答。我相信你可以轻松地测试MyFoo.SomeProperty == typeof(Bar),因为Foo将构造函数参数公开为某个属性。