2012-11-09 5 views
9

objectにはstructを含むリフレクション(最終的には未知のコンパイル時)を使用しようとしています。私はTypedReference.MakeTypedReferenceまで行ってきましたが、私は壁に衝突しました。Reflectオブジェクトの構造体のフィールドへのアクセス

は、ここに私のクラスと

public class MyObject 
{ 
    public int Id; 
    public Money Amount; 
} 

public struct Money 
{ 
    public int Vaule; 
    public string Code; 
} 

構造体

だとここで私はリフレクションを使用してMyObjectにして「量」の「コード」を設定しようとしています方法です。上で述べたように、コンパイル時にこれらの型についてわからない解決策を探しています(あまりにも簡単でしょう)

ここで私はこれまでのコードを使用しています[1]を使用するとコードが簡単になります)

var obj = new MyObject() { Id = 1 }; 
obj.Amount.Vaule = 10; 
obj.Amount.Code = "ABC"; 

FieldInfo[] objFields = obj.GetType().GetFields(); 
FieldInfo[] moneyFields = objFields[1].GetValue(obj).GetType().GetFields(); 

List<FieldInfo> fields = new List<FieldInfo>() { objFields[1] }; 
fields.AddRange(moneyFields); 

TypedReference typeRef = TypedReference.MakeTypedReference( 
          objFields[1].GetValue(obj), fields.ToArray()); 

moneyFields[1].SetValueDirect(typeRef, "XXX"); 

TypedReference.MakeTypedReferenceが吹きます。 "FieldInfoがターゲットタイプと一致しません。"同様に私はちょうどobjFields[1]を渡す場合。そして、単にmoneyFieldsを渡すと、 "TypedReferencesをプリミティブとして再定義することはできません。"

なぜですか?のは、私はランダムテスト・フィクスチャを作成し、ランダムなデータを持つクラスのフィールドを移入したいんだとしましょう:)

+0

コンパイル時にMyObjectまたはMoneyを使用しているかどうかわからないので、どのオブジェクトが使用されているかを検出してプロパティを読み書きする必要がありますそれに応じて? – series0ne

+0

AutoFixtureを使用し、反射Rube Goldbergマシンビジネスから抜け出す方法はありますか? (wrt 'struct'にもかかわらず、http://stackoverflow.com/questions/12930963/creating-a-struct-with-autofixture-throws-no-public-constructor-errorを参照してください)(' MakeTypedReference私は実際にツイートのストリームを一度見ていたので、何かを言いなさい!) –

+0

@RubenBartelink - 「理由」は単に参考にしたものです。それが私がやっていたものなら、defo 'はAutoFixtureを使用しますか? –

答えて

13

率直に言って、TypedReferenceのための一切の必要性がここにありません - ちょうど箱入り構造体は、正常に動作する必要があります:

var amountField = obj.GetType().GetField("Amount"); 
    object money = amountField.GetValue(obj); 
    var codeField = money.GetType().GetField("Code"); 
    codeField.SetValue(money, "XXX"); 
    amountField.SetValue(obj, money); 

しかしながら!

  • プロパティの代わりにパブリックフィールドは、通常はお勧めできません。それは多くの場合、後で
  • 変更可能な構造体(作成後に変更することができ、すなわち構造体)がほとんどない良いアイデアであり、さらに頻繁にかむと、可変構造体及び公共分野の​​化合物を組み合わせ
  • 困難をかむあなたをかみますそれは後で変更するのが非常に問題です。
+1

ありがとうMarc。とても有難い。 –

+5

@Ianちょっと弾丸に注意してください...これは素晴らしい考えではありません –

関連する問題