9

次のコードを検討してください。

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[]について取得できませんMyClassOptionsType.GetProperties常に空の配列を返します。最初は Xamarin.iOS のフレームワークのバグだと思っていましたが、同じフレームワークを対象とする別のプロジェクトで同じコードをテストしたところ、問題なく動作しました。

誰でもこれの考えられる原因を知っていますか?

編集

@Fabian Biglerの回答に感謝します。私のプロジェクトでは、リンカが中程度の動作に設定されていても、インスタンス化MyClassOptionsは実行時にクラス定義を維持するのに十分ではありませんでした。実際にインスタンスを使用した後 (プロパティの設定など) にのみ、クラスはビルドに保持されます。

リンカーは「未使用」のものをダミーに置き換えているようです。このプロジェクトではリフレクションを頻繁に使用するため、リンカーを無効にしただけで、すべてが再び機能しています。

4

1 に答える 1

10

このコードは私にとって完全にうまく機能します:

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

注: アセンブリ リンカーには注意してください

リンカーを有効にしてビルドしている場合は、クラスをどこかで使用する必要がある場合があるため、コンパイル時に取り除かれません。場合によっては、コード内でクラスをインスタンス化するだけでは不十分な場合があります。リンカは、インスタンスが使用されていないことを検出し、とにかくそれを削除します。

于 2013-06-13T15:41:33.643 に答える