2012-01-18 20 views
6

A örneğini List<A>, B ve List<B> vb. Için doğru bir şekilde eklemek için bu kod parçasını nasıl değiştirebilirim? Add() bağlayıcı tarafından bulunan iken, bu aşırı yük çözünürlüğü başarısız dynamic geçer, çünküListeye T eklenmesi <T> List '<T>' dinamik 've T' object 'olarak maskelenir?

// someChild's actual type is A 
object someChild = GetObject(); 
// collection's actual type is List<A> though method below returns object 
dynamic list = GetListFromSomewhere(...); 
// code below throws a RuntimeBinderException 
list.Add(somechild); 

istisnası atılır. Yukarıdaki yansımayı kullanmak için değiştirmek veya en azından bunu en aza indirmek için değil'u tercih ederim. Her bir A ve List<A> için System.Type örneğine erişimim var. Yukarıdaki kodu içeren sınıf veya yöntem, jenerik değildir.

cevap

2

Tek ihtiyacınız dinamik çok argüman için bağlayıcı hale getirmektir - böylece yalnızca dynamic olmak someChild türünü gerekir: Önceki kodda

dynamic someChild = GetObject(); 
dynamic list = GetListFromSomewhere(...); 
list.Add(somechild); 

, derleyici hatırladı olurdu someChild derleme zamanı türü object idi ve bu nedenle yürütme zamanı türü yerine derleme zamanı türünde kullanılır. Yürütme zamanı bağlayıcı, dinamik ifadeleri yalnızca aşırı yüklenme çözünürlüğü için dinamik olarak işlemek konusunda akıllıdır.

1

Jon'un sağ ben kabul ama List<T>IList (non-jenerik versiyon) uygulayan benim kendi unutkanlık de var bu yüzden:

object someChild = GetObject(); 
var list = (IList)GetListFromSomewhere(...); 
list.Add(somechild);