Bazı ek nasıl çalıştırılacağı: En genel sınıf birden fazla türde kabul ederse, örneğin, tip isimleri atladığınızda, Virgül gerekir makas kodu. Eğer Ancak
var fooContents = new List<FooContent>(fooContent)
new Encoder().Markdown(fooContents)
isteyeyim Eğer
public class Encoder() {
public void Markdown(IEnumerable<FooContent> contents) { do magic }
public void Markdown(IEnumerable<BarContent> contents) { do magic2 }
}
benzer bir sınıf var zamanında derleme zamanında bağlamak başardık Bir FooContent
varsayalım olduğunu varsayalım, bunu çalışma zamanında yapamazsınız. zamanında Bunu yapmak için çizgisinde yapacağını:
var listType = typeof(List<>).MakeGenericType(myType);
var dynamicList = Activator.CreateInstance(listType);
((IList)dynamicList).Add(fooContent);
dinamik yöntem çağrısında Markdown(IEnumerable<FooContent> contents)
new Encoder().Markdown((dynamic) dynamicList)
Not Ekle dynamic
kullanımını çağırmak için. Çalışma zamanında dynamicList
List<FooContent>
olacaktır (ek olarak IEnumerable<FooContent>
da olacaktır), çünkü dinamik kullanım bile güçlü bir şekilde yazılmış bir dile köklenmiş olduğundan çalışma zamanı bağlayıcısı uygun Markdown
yöntemini seçecektir. Tam tür eşleşmeler yoksa, bir nesne parametresi yöntemi arar ve hiçbir yöntem eşleşmediği konusunda bir çalışma zamanı bağlayıcısı istisnasıyla eşleşmeyecek şekilde yükseltilir.
Bu yaklaşıma geri çekiliş, derleme zamanında büyük bir tip güvenlik kaybıdır. Yine de, bu satırlardaki kodlar, çalışma zamanında tam olarak beklediğiniz gibi yazıldığından çok dinamik bir şekilde çalışmanıza izin verir.
Jenerik! = Şablonları. Tüm jenerik tip değişkenleri, çalışma zamanında değil, derleme zamanında çözülür. Bu, 'dinamik' tip 4.0'ın faydalı olabileceği durumlardan biridir. – Will
@Will - hangi şekilde? Generics ile kullanıldığında, geçerli CTP altında temelde
@MarcGravell, foo.Method ((dinamik) myGenericClass) 'işlevini çalışma zamanı yöntemi için kullanabilirsiniz. Bir tipin metot aşırı yüklenmesi için etkin bir şekilde servis belirleyici paterni. –