请考虑以下代码:
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; }
}
我无法获得关于PropertyInfo[]
的{{1}},Type.GetProperties
始终返回一个空数组。首先我认为这是Xamarin.iOS中的一个框架错误,但我在另一个针对相同框架的项目中测试了相同的代码并且它工作得很好。
任何人都知道可能的原因吗?
修改
感谢@Fabian Bigler回答我得到了它。
在我的项目中,即使Linker设置为适度的行为,实例化MyClassOptions
也不足以在运行时保持类定义。只有在实际使用实例后(例如设置属性),类才会保留在我的构建中。
似乎链接器用假人替换“未使用”的东西。 由于我将在这个项目中大量使用反射,所以我只是禁用了Linker,一切都恢复了。
答案 0 :(得分:7)
这段代码对我来说非常合适:
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
。有关详细信息,请查看this post。
然后从外面打电话:
var options = new MyClassOptions();
options.MyProperty = 1234;
var t = options.GetType();
var c = new MyNameSpace.MyClass(t);
如果您在启用链接器的情况下构建,则可能需要在某处使用该类,因此在编译时不会被删除。有时,仅在代码中实例化类是不够的,链接器可能会检测到实例从未被使用过,并且无论如何都会将其删除。