我的程序集有多个类,其中包含以下字段:
private static Foo MyFoo = new Foo(typeof(Bar));
每个类的参数typeof(Bar)
都不同。
在我的单元测试中,我需要动态提取该参数。
我可以找到所有类,并过滤那些具有静态Foo
字段的类。然后我有一个FieldInfo
。
但是我不知道如何获得该论点的类型?
答案 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
将构造函数参数公开为某个属性。