を含むリフレクション(最終的にはコンパイル時に不明)を使用しようとしてobject
いますstruct
。限りはTypedReference.MakeTypedReference
ありますが、壁にぶつかりました。
これが私のクラスと構造体です
public class MyObject
{
public int Id;
public Money Amount;
}
public struct Money
{
public int Vaule;
public string Code;
}
そして、これが私がリフレクションを使ってMyObjectの「Amount」の「Code」を設定しようとしている方法です。上で述べたように、私はコンパイル時にこれらのタイプについて知らない解決策を探しています(それは簡単すぎるでしょう!)
これが私がこれまでに持っているコードです(コードを単純にするために[0]、[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をプリミティブとして再定義することはできません」というメッセージが表示されます。
なんで?ランダムテストフィクスチャを作成していて、クラスフィールドにランダムデータを入力したいとします:)