使用反射获取字段初始化程序中使用的 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;
我的程序集有多个 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;