2016-08-26 6 views
3

私は以下のクラス構造を持っています。私はこのエラーが発生しています。ここに何かがないのですか?リフレクトを使用してクラスのインスタンスのジェネリックリストプロパティにオブジェクトを追加する方法

オブジェクトがターゲットタイプと一致しません。私がしようとしています何

クラス構造

public class Schedule 
{ 
    public Schedule() { Name = ""; StartDate = DateTime.MinValue; LectureList = new List<Lecture>(); } 
    public string Name { get; set; } 
    public DateTime StartDate { get; set; } 
    public List<Lecture> LectureList { get; set; } 
} 

public class Lecture 
{ 
    public string Name { get; set; } 
    public int Credit { get; set; } 
} 

は:

// gets metadata of List<Lecture>.Add method 
var addMethod = pi.PropertyType.GetMethod("Add"); 

// retrieves current LectureList value to call Add method 
var lectureList = pi.GetValue(s); 

// calls s.LectureList.Add(obj); 
addMethod.Invoke(lectureList, new object[] { obj }); 

UPD:

Schedule s = new Schedule(); 
Type t = Type.GetType("Lecture"); 
object obj = Activator.CreateInstance(t); 
obj.GetType().GetProperty("Name").SetValue(obj, "Math"); 
obj.GetType().GetProperty("Credit").SetValue(obj, 1); 
PropertyInfo pi = s.GetType().GetProperty("LectureList"); 
Type ti = Type.GetType(pi.PropertyType.AssemblyQualifiedName); 
ti.GetMethod("Add").Invoke(pi, new object[] { obj }); 
+0

問題を再現しようとしますが、私は別の問題を発見しました。文字列のときに 'Credit 'に' 1'を設定します。型をintに変更します。 –

+0

@stuartd私は反射を正しく使う理由がありますか? – Helio

+0

私はあなたのコードを試してみましたが、この文の後にnull値があります タイプt = Type.GetType( "Lecture"); 明らかに、次のステートメントはnull ref例外をスローしますが、得られたメッセージは異なるものです。 Type.GetTypeの使用が問題の可能性があることがわかりました。その場合は、Jon Skeetの答えを確認してください - http://stackoverflow.com/a/1044472/1966993 –

答えて

1

それはこのようなものでなければなりません。ここにはフィドルlinkがあります。

+0

答えをお寄せいただきありがとうございます.GetValue(s)は私が見逃していたものです... – Helio

+0

'Type.GetType'は不要です。' PropertyInfo.PropertyType'を使用してください。 – Dennis

1

AddメソッドがList<Lecture>になり、メソッドを呼び出すインスタンスとしてPropertyInfoを呼び出して問題が発生することがあります。

変更:

ti.GetMethod("Add").Invoke(pi, new object[] { obj }); 

object list = pi.GetValue(s); 
ti.GetMethod("Add").Invoke(list, new object[] { obj }); 

pi.GetValue(s)のみそのgetset方法と共にプロパティそのものを表し、そのを呼び出すPropertyInfo(からList<Lecture>自体を取得すること方法引数としてobject[]を使用してAddメソッドを実行します。


もう1つ。使用した理由:

Type ti = Type.GetType(pi.PropertyType.AssemblyQualifiedName); 

あなただけ使用することができた場合:

Type ti = pi.PropertyType; 
関連する問題