【问题标题】:How to get fields of a generic type in C# [duplicate]如何在 C# 中获取泛型类型的字段 [重复]
【发布时间】: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


【解决方案1】:

你需要使用

        Foo<int> fooInt = new Foo<int>();
        FieldInfo fooValField = fooInt.GetType().GetField("fooVal", BindingFlags.NonPublic | BindingFlags.Instance);

因为该字段不公开。

【讨论】:

    猜你喜欢
    • 2021-07-17
    • 2011-09-13
    • 2019-06-04
    • 2015-11-20
    • 2018-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    相关资源
    最近更新 更多