【发布时间】:2016-04-04 21:34:56
【问题描述】:
假设我有一个通用类
class Foo<T>
{
T fooVal;
public T FooVal { get { return fooVal; } }
}
我想从实例化类型中获取 fooVal 的 FieldInfo:
Foo<int> fooInt = new foo<int>();
FieldInfo fooValField = fooInt.GetType().GetField("fooVal");
问题是,fooValField 为空。即使我调用GetFields(),它也会返回一个空数组。我知道类型是正确的,因为反射告诉我它是 Foo'1。我只是不明白为什么它看不到 fooVal 字段。我在这里缺少什么吗?如果我调用 GetProperties,我可以看到 FooVal 属性,所以我希望 fooVal 字段也会出现?
【问题讨论】:
-
你应该使用
BindingFlags.NonPublic|BindingFlags.Instance和允许你指定它们的重载。 -
谢谢!我最初使用了那些 BindingFlags,当时我一定有其他错误。我认为不带参数调用 GetFields() 会返回 all 字段并揭示我的错误,但事实并非如此。我再次尝试使用那些 BindingFlags 并且它有效。如果您将此作为答案,我可以给它一个大的绿色复选标记:)
-
@DavidL 我同意这几乎是重复的,尽管我不关心属性。我确实尝试过先搜索,但由于某种原因,这个问题从未出现过!
-
里面也有错别字。当它实际上是 FooVal 时,您正在寻找 fooVal。如果您想访问该值,请使用 InvokeMember。对于实例成员,您必须将其更改为 Private Access。
-
@ManoDestra 这不是错字 - 我正在寻找 fooVal 字段,而不是 FooVal 属性。我本来会忽略该属性,但想表明我能够获得该属性而不是该字段。
标签: c# generics reflection field