0

WP7アプリをwin8ストアアプリに移植する際に問題が発生しました...

このコードを実行して、XMLファイル内の要素からフィールドにデータを入力します。

Venue lv = new Venue();

            foreach (var t in Fields)
            {
                foreach (var f in t.Elements())
                {
                    lv.SaveData(f.Attribute("name").Value, f.Value, lv);
                }
            }

データクラス:

 public class Venue //: INotifyPropertyChanged
    {
        public string updated_at { get; set; }
        public string name { get; set; }
        public string authority { get; set; }
        public string organisation { get; set; }
        public string control_type { get; set; }
    }

SaveDataメソッドを実行します。

public void SaveData(string field, string value, Venue v)
        {

            foreach (MemberInfo mi in v.GetType().GetTypeInfo().GetMembers())
            {
                if (mi.MemberType == MemberTypes.Property)
                {
                    PropertyInfo pi = mi as PropertyInfo;

                    if (pi.Name == "Coordinate")
                        continue;

                    if (pi.Name == field)
                    {
                        pi.SetValue(v, value, null);
                    }
                }
            }
        }

問題は、GetMembers定義がWinRTに存在しないため、同じプロパティを公開するための代替手段を見つけるか、システムを書き換える方法を見つける必要があるということです。

私はこのコードを自分で書いたわけではありませんが、それが何をしているのかはほぼ理解できます。読んだばかりの基本的な紹介を除けば、リフレクションについてはあまり詳しくありません。クイックフィックス

4

1 に答える 1

2

GetType拡張メソッドです。リフレクション名前空間を含める必要があります。

using System.Reflection;

あなたのSaveData方法では、次のようなことができます。

public void SaveData(string field, string value, Venue v)
{
    var typeinfo = v.GetType().GetTypeInfo();
    var pi = typeinfo.GetDeclaredProperty(field);

    if (pi != null && pi.Name != "Coordinate")
       pi.SetValue(v, value);
}

上記のコードよりも優れたエラーチェックを実行することをお勧めします。たとえば、とがnullでないことを確認vpi.Nameます。

于 2013-02-23T19:16:59.913 に答える