4

辞書型コレクションに対して次のループがあります

foreach(KeyValuePair<Vector2, Object> entry in v_map.map_set)
{

}

オブジェクトのプロパティにアクセスしたいのですが、予期した構文が機能しません。例えば:

foreach(KeyValuePair<Vector2, Object> entry in v_map.map_set)
            {
                Object ob = entry.Value;
                ob.property;
            }

C# が必要なプロパティを見つけられないため、失敗します。では、目的のプロパティにアクセスするにはどうすればよいでしょうか。

解決:

  foreach(KeyValuePair<Vector2, Object> entry in v_map.map_set)
            {
                if (entry.Value is warehouse)
                {
                    warehouse ob = (warehouse)entry.Value;

                }
            }
4

5 に答える 5

2

Refection を利用して、オブジェクトのプロパティの値を取得できます。

このようなもの

PropertyInfo info2 = object.GetType().GetProperty("prpertyname");
Object val = info2.GetValue(object, null);
于 2013-01-09T13:57:50.930 に答える
2

KeyValuePair にあるオブジェクトの型がわかっている場合は、その型にキャストでき、必要なプロパティを見つけることができます。

また、いくつかの異なるオブジェクトが保存されている場合は、 を使用してどのタイプであるかを確認できますis。そのようです:

if(entry.Value is Foo)
{
   Foo lFoo = (Foo)entry.Value;
}
else if(entry.Value is Bar)
{
   Bar lBar = (Bar)entry.Value;
}
于 2013-01-09T13:58:36.077 に答える
0

必要な型にキャストentry.Valueする必要があります。オブジェクト型自体は、必要なプロパティを公開しません。

于 2013-01-09T14:00:16.083 に答える
0

問題は、object入力されていない を使用していることです。したがって、次のようにリフレクションを使用する必要があります。

PropertyInfo pi = ob.GetType().GetProperty("PropertyName");
var val = pi.GetValue(ob, null);

プロパティがそうでない場合は、public次のようなものを使用する必要があります。

PropertyInfo pi = ob.GetType().GetProperty("PropertyName", BindingFlags.Instance | BindingFlags.NonPublic);
var val = pi.GetValue(ob, null);

さて、これが実際に到達しようとしているフィールドである場合は、さらに別のことを行う必要があります。

FieldInfo fi = ob.GetType().GetField("fieldName");
var val = fi.GetValue(ob);

GetProperty メソッド

BindingFlags 列挙体

GetField メソッド

于 2013-01-09T13:58:31.650 に答える
0

値にアクセスする必要があるだけで、使用できる予想される型がわかっている場合

foreach(ExpectedType value in v_map.map_set.Values.OfType<ExpectedType>())
{
    var property = value.Property;
}

PropertyのプロパティExpectedTypeです。

于 2013-01-09T14:02:31.897 に答える