2016-04-14 15 views
0

ListViewのすべてのプロパティを複製しようとしているため、コード行で各コードを個別にコピーする必要はありませんが、数多くの試行の後には機能しません。 私は今のエラーを取得:オブジェクトのクローンを作成する

Exception has been thrown by the target of an invocation.

は、プロパティがすべて間違って設定されている方法の私の理解ですか?

private ListView generateEmptyClone(ListView toClone) 
{ 
    ListView newCopy = new ListView(); 

    foreach (var propToClone in toClone.GetType().GetProperties()) 
    { 
     PropertyInfo propInfo = newCopy.GetType().GetProperty(propToClone.Name); 
     if (propInfo.CanWrite) 
      propInfo.SetValue(newCopy, propToClone.GetValue(toClone, null)); 
    } 

    return newCopy; 
} 
+1

おそらくいくつかの私有財産を読もうとしていますか?あなたの 'TargetInvocationException'には実際に何が起こったのかを示す内部例外があると思います。 –

答えて

0

RenéVogtがコメントで述べたように、プライベートプロパティにアクセスしています。 BindingFlagsを使用して、必要なプロパティにプロパティを制限します。

0

PropertyInfo.CanWriteプロパティは、プロパティにセッターがあるかどうかだけを通知します。プロパティがpublicであるかどうかはわかりません。

にのみ、このようpublicインスタンスのプロパティを列挙すべきである:あなたがそれらを列挙する必要はありませんので、

foreach (var propToClone in toClone.GetType(). 
       GetProperties(BindingFlags.Instance | BindingFlags.Public)) 
{ 
    PropertyInfo propInfo = newCopy.GetType().GetProperty(propToClone.Name); 
    if (propInfo.CanWrite) 
     propInfo.SetValue(newCopy, propToClone.GetValue(toClone, null)); 
} 

staticプロパティは、すでにすべてのListViewインスタンスに対して同じです。


それあなたはおそらく唯一の「普通の」ListViewプロパティのクローンを作成したいと私は、これはあなたの場合には必要だとは思わない(GetFields()を使用して)反射によってprivateフィールドを設定することが可能ですが。

まだTargetInvocationExceptionが表示される場合は、別の問題がある可能性があります。 TargetInvocationExceptionには通常、正確に何が間違っているかを示すInnerExceptionがあります。たとえば、SelectedIndexのクローンを複製する前に、Itemsのクローンを作成すると、IndexOutOfRangeExceptionが発生することがあります。しかし、クローン化Items自体がエラーを起こす可能性があります。

関連する問題