2017-02-24 2 views
0

多くのオブジェクトでプロパティに値を設定しようとしています。 私は2つのパラメータMyStructuredObjectsとMyObjectを受け取る関数を持っています MyStructuredObjectsにMyObjectのリストがあります。 この関数は多くの 'if'を削除するための再作成です。SetValueメソッドは、反射を使用すると例外をスローします。

これはループで使用される機能なので、同じオブジェクトを使用したいと思います。可能であれば、 「オブジェクトがターゲットと一致しません」という例外が発生しました。 これを投稿して申し訳ありませんが、このような問題は見つかりませんでした。オブジェクト構造内でListを使用しています。

は見てみましょう:

public class MyStructuredObjects 
{ 
    public List<MyObject1> Object1 { get; set; } 
    public List<MyObject2> Object2 { get; set; } 
    public List<MyObject3> Object3 { get; set; } 
    public List<MyObject4> Object4 { get; set; } 
    public List<MyObject5> Object5 { get; set; } 
} 

private void SetValuesToObjectsToIntegrate<T>(ref MyStructuredObjects returnedObject, T obj) 
{ 
    Type t = obj.GetType(); 
    var propertyInfo = new ObjectsToIntegrate().GetType().GetProperties(); 
    var instance = Activator.CreateInstance(t); 
    foreach (var item in returnedObject.GetType().GetProperties()) 
    { 
     var itemType = item.PropertyType; 
     if (t == itemType)  // PASSING BY HERE OK , it finds the same type :P 
     { 
      item.SetValue(t, Convert.ChangeType(obj, item.PropertyType), null); 
     } 
    } 
} 

アップデート:コードは次のようになります。

item.SetValue(instance, Convert.ChangeType(obj, item.PropertyType), null); 
+0

'SetValue'は* *インスタンスを期待しています。あなたはそれを型に渡しているだけです。あなたはおそらく 'item.SetValue(returnedObject ...' – Rob

+0

Robを使って、コード に変更します。item.SetValue(インスタンス、Convert.ChangeType(obj、item.PropertyType)、null); ' –

+0

@Summerson - コメントを無効にするためにあなたの質問を編集しないでください。 – Enigmativity

答えて

0

私は私はあなたが何をしようとして理解すると思います。

あなたがこのようにプロパティを設定しようとしていることが表示されます:o2のタイプは、プロパティの型と一致するので

var o2 = new List<MyObject2>(); 
var mso = new MyStructuredObjects(); 
SetValuesToObjectsToIntegrate(ref mso, o2); 

はだからmsoはその性質Object2セットを持っています。

そのような場合、その後、あなただけのこのコードが必要になります。

private void SetValuesToObjectsToIntegrate<T>(MyStructuredObjects returnedObject, T obj) 
{ 
    foreach (var propertyInfo in typeof(MyStructuredObjects).GetProperties()) 
    { 
     if (typeof(T) == propertyInfo.PropertyType) 
     { 
      propertyInfo.SetValue(returnedObject, obj, null); 
     } 
    } 
} 

あなたがreturnedObjectのインスタンスを変更していないようrefMyStructuredObjects returnedObjectに合格する必要はありません。

使用このこのコードを呼び出すために:

var o2 = new List<MyObject2>(); 
var mso = new MyStructuredObjects(); 
SetValuesToObjectsToIntegrate(mso, o2); 

このコールの後、私は今取得:

result

関連する問題