単純なオブジェクトメソッドをアタッチする場合とは異なり、リフレクションを使用してジェネリックリストをクラスのインスタンスにアタッチしようとしています。値が(文字列、int、bool、またはカスタムクラスではなく)のインスタンスである場合にPropertyInfo.SetValue(obj, value, index)
例外が返されます。 )。{"Parameter count mismatch."}
List<SomeType>
その夏らしいことはあまり意味がないかもしれません。以下は、私がやろうとしていることを説明するのに役立つかもしれません。
次のクラスにリフレクションを追加しようとしているとします。
public class Foo
{
public virtual int someInt {get; set;}
public virtual IList<SomeClass> list {get; set;}
}
メソッドは次のようになります。
public static T Parse<T>(HttpRequest request) where T : new()
{
returnObj = new T();
PropertyInfo[] properties = typeof(T).GetProperties();
foreach (PropertyInfo p in properties)
{
// Get a meaningful property name
string ins = System.Text.RegularExpressions.Regex.Replace(p.PropertyType.FullName, "([^,]*),.*$", "$1");
switch(ins)
{
// populate int
case "System.Int32":
p.SetValue(returnObj, Int32.Parse(request[p.Name]) , null);
break;
// populate list
case "System.Collections.Generic.IList`1[[SomeNamespace.Domain.SomeClass":
IList<SomeClass> list = new List<SomeClass>();
foreach (string s in request[p.Name].Split(','))
{
list.Add(new SomeClass(s));
}
// This will throw the exception 'Parameter count mismatch.'
p.SetValue(returnObj, list, null);
break;
}
}
return returnObj;
}
ただし、この方法でList(IList)のインスタンスを追加しようとすると、例外がスローされます。
編集:明確にするために、細かい櫛(ブレークポイント)を使用してこのメソッドを終了した場合(まあ、アプリケーション内のもの、正確にはこれではありません)、すべての変数が期待どおりに入力されます。SetValue
例外をスローするまで。誰かがさらに情報が必要な場合は、尋ねてください。
Edit2:それで、これをテストするための小さなアプリケーションを作成しました(例としてアップロードするため)。自分の問題を再現するのに苦労しています。あなたの多くがこれがうまくいくことを提案したように。この質問を追跡できたら、この問題を更新します。これらのことはよくあることですが、おそらく些細なことです(元のコードベースは巨大であるため、投稿するのには適していません)。これまでのすべてのご協力と、時間を無駄にしてしまったことをお詫び申し上げます。