2009-03-19 8 views
3

私はC#(.Net 2.0)の構造体の値を繰り返し処理できるようにしたいと考えています。これは、実行時に行われ、構造体内の可能な値についての知識はありません。構造体を反復処理するか?

Reflectionを使用して構造体の値をリストに追加するか、構造体をIEnumerableインタフェースを実装するデータ構造体に変換するかのどちらかの考えに沿って考えていました。誰でも任意のポインタを提供できますか?

ご協力いただきありがとうございます。

よろしく、 アンディ。

+0

あなたはyou'rが本当に代わりに、構造体の列挙型を意味しないよろしいです?。この場合、質問には何らかの意味があります –

答えて

10

:あなたはこの能力を持つ構造体のセットを宣言したい場合は、それらがIEnumerable<KeyValuePair<string, object>>を実装してGetEnumerator()を定義することができますかおそらく?その場合は、Type.GetFields()またはType.GetProperties()の方法があります。

あなたは絶対にstructを使用する必要がありますか?これは、特に構造体に複数の値が含まれている場合は、C#での最適な設計の決定はめったにありません。

編集:はい、それは構造体が従来の理由で使用されているようです。

構造体のフィールドが公開されていない場合は、適切なBindingFlags(例:BindingFlags.Instance | BindingFlags.NonPublic)を指定する必要があります。最も単純なレベルでは

+0

Jon、 私はそれらを自分で避けたいと思っていますが、私は従来のアプリケーションを扱っています。あなたのアドバイスをありがとう。 – MagicAndi

+1

ジョン、もう一度ありがとうございます。私は次のコードを使って反復することができました: タイプstructType = typeof(MyStruct); FieldInfo [] fields = structType.GetFields(); Foreach(フィールドのFieldInfoフィールド){...} – MagicAndi

0

すべての構造体で機能するようにするには、リフレクションを使用する必要があります。 ?構造体の中の様々なフィールドを - あなたは正確に何を意味する

yield return new KeyValuePair<string, object>("Field1", Field1); 
yield return new KeyValuePair<string, object>("Field2", Field2); 
// ... and so forth 
2

、あなたがプロパティを反復処理したいと仮定:

PropertyInfo[] properties = myStructInstance.GetType().GetProperties(); 
foreach (var property in properties) { 
    Console.WriteLine(property.GetValue(myStructInstance, null).ToString()); 
} 
1

私は、次のようなものを使用します。

[StructLayout(LayoutKind.Sequential)] 
public struct MY_STRUCT 
{ 
    public uint aa; 
    public uint ab; 
    public uint ac; 
} 

MY_STRUCT pMS = new MY_STRUCT(); 

FieldInfo[] fields = pMS.GetType().GetFields(); 
foreach (var xInfo in fields) 
    Console.WriteLine(xInfo.GetValue(pMS).ToString());