LoopValueInjection を使用し、いくつかのカスタム ロジックで SetValue(object v) メソッドをオーバーライドして、ある型から別の型にマップするために Value Injecters を使用しています。HashSet が渡されたときを検出し、HashSet を通過し、その中の各項目にメソッドを適用してクリーンアップを実行しようとしています。私が抱えている問題は、パラメーターが単なるオブジェクトであり、HashSet 内のアイテムのタイプがわからないためです。たとえば、HashSet または HashSet などです。
ここに私が現在持っているコードがありますが、InvalidCastException が発生しています。
protected override object SetValue(object v)
{
if (type.Name == "HashSet`1")
{
var genericType = type.GetGenericArguments()[0];
// this line throws the InvalidCastException
var cleanHashSet = (HashSet<object>)Activator.CreateInstance(type);
foreach (var item in (HashSet<object>)v) // I'm sure this cast will throw as well
{
cleanHashSet.Add(Clean(item));
}
return cleanHashSet;
}
return base.SetValue(v);
}
主な問題は、実際に何らかの種類の HashSet であると判断した後、オブジェクトとして渡された HashSet をどのようにループ処理できるかということだと思います。また、特定のタイプの新しい空の HashSet も作成する必要があると考えています。これにより、クリーンアップされる各アイテムをその中に入れることができます。