簡體   English   中英

Type.GetProperties什么都不返回

[英]Type.GetProperties returning nothing

請考慮以下代碼:

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; }
}

我無法獲得有關MyClassOptions PropertyInfo[]Type.GetProperties總是返回一個空數組。 首先我認為這是Xamarin.iOS中的一個框架錯誤,但我在另一個針對相同框架的項目中測試了相同的代碼並且它工作得很好。

有人知道可能的原因嗎?

編輯

感謝@Fabian Bigler回答我得到了它。 在我的項目中,即使Linker設置為適度的行為,實例化MyClassOptions也不足以在運行時保持類定義。 只有在實際使用實例后(例如設置屬性),類才會保留在我的構建中。

似乎鏈接器用假人替換“未使用”的東西。 由於我將在這個項目中大量使用反射,我剛剛禁用了鏈接器,一切都恢復正常。

這段代碼對我來說非常好:

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);

注意:小心裝配鏈接器

如果您在啟用鏈接器的情況下構建,則可能需要在某處使用該類,因此在編譯時不會被刪除。 有時,僅在代碼中實例化類是不夠的,鏈接器可能會檢測到實例從未使用過,並且無論如何都會將其刪除。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM