Type.GetProperties返回空值

11

请考虑以下代码:

public class MyClass
{
    public MyClass(Type optionsClassType)
    {
      //A PropertyInfo[0] is returned here
      var test1 = optionsClassType.GetProperties();
      //Even using typeof
      var test2 = typeof(MyClassOptions).GetProperties();
     //Or BindingFlags
      var test3 = typeof(MyClassOptions)
          .GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Public);
    }
}

public class MyClassOptions
{
    public int MyProperty { get; set; }
}

我无法获取关于MyClassOptionsPropertyInfo[]Type.GetProperties总是返回一个空数组。起初我认为这是Xamarin.iOS中的框架错误,但我在针对相同框架的另一个项目中测试了相同的代码,结果正常运行。

有人知道可能的原因吗?

编辑

感谢@Fabian Bigler的答案,我明白了。 在我的项目中,即使链接器设置为适度的行为,实例化MyClassOptions还不足以在运行时保留类定义。只有在实际使用实例(例如设置属性)之后,该类才会保留在我的构建中。

似乎链接器用虚拟对象替换了“未使用”的东西。 由于在这个项目中我将经常使用反射,所以我刚刚禁用了链接器,现在一切都正常了。

1个回答

11

这段代码对我来说完全正常:

namespace MyNameSpace
{
    public class MyClass
    {
        public MyClass(Type optionsClassType)
        {
            //A PropertyInfo[0] is returned here
            var test1 = optionsClassType.GetProperties();
            //Even using typeof
            var test2 = typeof(MyClassOptions).GetProperties();
            //Or BindingFlags
            var test3 = typeof(MyClassOptions).GetProperties
(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance);
        }
    }

    public class MyClassOptions
    {
        public int MyProperty { get; set; }
    }
}

在代码中添加了BindingFlags.Instance。如需更多信息,请查看此帖子


然后从外部调用此函数:

var options = new MyClassOptions();
    options.MyProperty = 1234;
    var t = options.GetType();
    var c = new MyNameSpace.MyClass(t);

注意:要小心汇编链接器

如果您启用了链接器进行构建,则可能需要在某个地方使用该类,以便在编译时不会将其删除。有时,仅在代码中实例化该类是不够的,链接器可能会检测到该实例从未被使用并将其删除。


由于某种原因,对我而言仅前两个有效,使用绑定标志会返回一个空数组(使用Visual Studio 2010)。 - Cemafor
在一个干净的项目中,这段代码对我也有效,但是当我尝试在我的大型项目中执行此操作时,出现了问题,并返回了一个空数组...即使在此项目中临时编写此示例后仍然如此。项目本身一定有问题,我真的不知道是什么问题。 - kbtz
@FabianBigler,我已经搞定了伙计。请查看我问题中的编辑。谢谢! - kbtz
@cvsguimaraes:同样的问题。在空项目中创建时似乎没问题,但如果我尝试在现有项目中使用它,则无法正常工作。 - Mark Karwowski
@MarkKarwowski请查看我在此答案末尾的编辑。仔细检查项目配置和框架版本... - kbtz
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接