2011-10-15 5 views
5

değişkenlerin genel listeye Casting ben tip List<*DynamicType*> dinamik değişkenin Capacity özelliğini değiştirmek gerekir. sorun olduğunu değişken türü doğru List<*DynamicType*> yerine belirtilmiş ve yapabileceğim en iyi IList için döküm olup değilse Activator döner object -casted değişken:dinamik tip

DynamicTypeBuilder builder = new DynamicTypeBuilder() { ... }; 
Type dataType = builder.GenerateType(...); 
Type listDataType = typeof(List<>).MakeGenericType(dataType); 
IList list = (IList)Activator.CreateInstance(listDataType); 

Ben sadece bir hack buldum Bazı arama yaptıktan sonra:

dynamic dynamicList = list; 
dynamicList.Capacity = dataRowsCount; 

bunu yapmanın başka yolu varsa bu acaba benim durumumda kabul edilebilir olsa da.

var capacityProperty = listDataType.GetProperty("Capacity"); 
capacityProperty.SetValue(list, dataRowsCount, null); 

alternatif statik olarak yazılan bir şekilde istediğiniz her şeyi yapan bir jenerik yöntem yazmaktır ve bunun yerine yansıma ile o çağırır:

cevap

3

Belki de bu basittir:

object list = Activator.CreateInstance(listDataType, 
    new object[]{dataRowsCount}); 

doğru yapıcı kullanmalıyım?

Eşdeğer ve yansıma gerçekten bir arada bir ağrıdır. dynamic burada kesmek (doğrulanmamış bir özellik üyesi vs, bir değişmez olarak sihirli bir dize) yansıma yoluyla ayarlama daha çirkin olduğunu ve dynamic içten optimize edilmiş ve (Tür başına) önbelleğe, bu yüzden onunla ilgili bir sorun olmazdı . Eğer sadece bir özelliğinden daha fazlasını yapmak gerekiyorsa, ayrıca çirkin aza indirmek için, genel bir yöntem haline çevirmek için dynamic kullanabilirsiniz: Doğru T ile jenerik yöntemi çağırmak olacaktır

void Evil<T>(List<T> list, int capacity) { 
    list.Capacity = capacity; 
    // do other stuff 
} 
... 
dynamic list = Activator.CreateInstance(listDataType); 
Evil(list, dataRowsCount); 

. Sadece 1 üye için değil, daha karmaşık senaryolar için yararlı olabilir.

+0

Bu kurucu hakkında unuttum. Sadece bu özelliği ayarlamam gerektiğinden, bu şekilde yapmak gerçekten daha basit. Ayrıca, IList nesnesini çok iyi kullanabilmeniz için genel yöntem kullanma önerilerinizi de beğeniyorum. –

+0

BTW, yanlış bir şey yapıyorum, ancak benim durumumda 'Activator.CreateInstance()' '' jeneric' değişkeninin sonucunu atamak işe yaramaz, çünkü 'list.Add (* Dinamik olarak oluşturulmuş dataType nesnesi *)' istisna ile sonuçlanır ve ön liste ile "listist" için "IList" çalışır. –

+0

@Dmitry emin olun, daha sonra 'IList' için yayınlayın. Örnekte bunu yapmadım, basitçe örnekte * işlemlerin gerçekleştirilmesi için minimumun gösterildiği ve örnekte "Ekle (...)" harfi bulunmuyordu –

4

Sen yansıması ile bunu yapabilirsiniz. Bu, tek bir yansımaya ihtiyacınız olduğundan emin olmanın kullanışlı bir yolu olabilir.

+0

Güzel, herhangi bir nedenden dolayı yansımayı düşünmedik. Dinamik \ jeneriklerle tekrar uğraşırken bunu aklımda tutacağım. –