2

単純なオブジェクトメソッドをアタッチする場合とは異なり、リフレクションを使用してジェネリックリストをクラスのインスタンスにアタッチしようとしています。値が(文字列、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:それで、これをテストするための小さなアプリケーションを作成しました(例としてアップロードするため)。自分の問題を再現するのに苦労しています。あなたの多くがこれがうまくいくことを提案したように。この質問を追跡できたら、この問題を更新します。これらのことはよくあることですが、おそらく些細なことです(元のコードベースは巨大であるため、投稿するのには適していません)。これまでのすべてのご協力と、時間を無駄にしてしまったことをお詫び申し上げます。

4

2 に答える 2

2

質問からコードを実行し、コンパイルするためにいくつかの小さな変更を加えましたが、正常に機能しているようです。

void Main()
{
    Parse<Foo>();
}

public static T Parse<T>() where T : new()
{
   var returnObj = new T();
   PropertyInfo[] properties = typeof(T).GetProperties();
   foreach (PropertyInfo p in properties)
   {
     // Get a meaningful property name
     string ins = p.PropertyType.Name;
     switch(ins)
     {
        // populate int
        case "Int32":
           p.SetValue(returnObj, 1 , null);
           break;

        // populate list
        case "IList`1":
           var list = new List<string>();
           // This will throw the exception 'Parameter count mismatch.'
           p.SetValue(returnObj, list, null);
           break;
      }
   }
   return returnObj;
}

public class Foo
{
 public virtual int someInt {get; set;}
 public virtual IList<string> list {get; set;}
}

Foo一方、を返すインデクサープロパティを持つように変更するとIList、質問で例外が発生します。

public class Foo
{
 public virtual int someInt {get; set;}
 public virtual IList<string> this[int key] 
 {
    get{ return null; }
    set 
    {
    }
 }
}

生成:

TargetParameterCountException:パラメーター数の不一致。

于 2012-08-28T16:37:06.497 に答える
1

ケースを確認しましたか

"System.Collections.Generic.IList`1[[SomeNamespace.Domain.SomeClass"

打たれていますか?リストを渡すと、IListとして作成されたものでも、GetType()で取得できます。

System.Collections.Generic.List`1[SomeNamespace.Domain.SomeClass]

使用する方が信頼性が高い可能性がありますか?

typeOf(System.Collections.Generic.IList).isAssignableFrom(p.GetType())
于 2012-08-28T16:22:49.530 に答える