2016-04-14 19 views
0

ListView'un tüm özelliklerini kopyalamaya çalışıyorum, böylece her bir kodu bir satır ile ayrı ayrı kopyalamak zorunda kalmam ama çok sayıda denemeden sonra, çalışmayı başaramadım .Nesne Özelliklerini Klonlama

Exception has been thrown by the target of an invocation.

özelliklerin hepsi yanlış ayarlanır nasıl benim anlayış mı: Şimdi hatası alıyorum?

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

Muhtemelen bazı özel mülkleri okumaya mı çalışıyorsunuz? 'TargetInvocationException' öğesinin, aslında neyin yanlış gittiğini gösteren bir iç özel durumu olduğunu düşünüyorum. –

cevap

0

René Vogt kendi yorumunda bahsettiği gibi, özel mülklere erişim kullanıyor. Özellikleri gerçekten ihtiyacınız olanlarla sınırlamak için BindingFlags kullanın.

0

Yalnızca PropertyInfo.CanWrite özelliği, tesisin ayarlayıcısına sahip olup olmadığını bildirir. Özelliğin public olup olmadığını size bildirmez.

yalnızca böyle public örnek özelliklerini numaralandırmak olmalıdır: bunları saymak gerek kalmaz

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 özellikleri, zaten tüm ListView örnekleri için eşittir.


o muhtemelen sadece "normal" ListView özelliklerini klonlamak istediğiniz gibi, bu durumda da gerekli olduğunu düşünmüyorum (GetFields() kullanarak) yansıma yoluyla private alanları ayarlamak mümkün olsa.

TargetInvocationException hala alıyorsanız başka bir sorun olabilir. TargetInvocationException s normalde tam olarak neyin yanlış gittiğini söyleyen bir InnerException'a sahiptir. Örneğin, Items klonlamadan önceSelectedIndex özelliğini klonlayın, bu bir IndexOutOfRangeException neden olabilir. Ancak, Items numaralı klonlama hataya neden olabilir.

İlgili konular