2012-05-31 19 views
5

Bunun daha önce sorulmuş olduğundan eminim ama ne yazık ki bulduğum tek şey benim için çözüm olmayan this idi. onun tipi dinamik olarak değişir çünkü obj döküm ettik çünkü bu kod elbette çalışmıyorNesneyi dinamik olarak nasıl dökerim?

private object obj; 

private void Initialize() 
{ 
    obj.Initialize(); 
} 

private void CreateInstanceA() 
{ 
    obj = Activator.CreateInstance(typeof(MyClassA)); 
} 

private void CreateInstanceB() 
{ 
    obj = Activator.CreateInstance(typeof(MyClassB)); 
} 

: benim şimdiki projede ben böyle bir şey yapmak.

Dinamik olarak nasıl yayınlayabilirim?

+4

Bu, işler hakkında gitmenin en iyi yolu olmayacak gibi görünüyor. Bir çeşit kod bana kokar. Başarmaya çalıştığınız şeyin daha geniş bağlamı nedir? – FishBasketGordo

+0

Başlatmadan başka, 'obj' ile ne yapmayı düşünüyorsunuz? –

+0

@RaymondChen Sınıf kütüphanelerimi test etmek için basit bir WinForm projesi yaptım. – Leri

cevap

9

üç seçenek:

  • her iki sınıfları kontrol ediyor, onları gereken her şeyi içeren ortak bir arabirim yapabilir, o zaman bunu - ve iseniz arayüzüne
  • için döküm C# 4 ve .NET 4 kullanarak, dinamik yazmayı kullanabilirsiniz - sadece değişkeni private dynamic obj; olarak bildirin ve yürütme zamanında doğru yöntemi derleyip bulacaktır
  • Aksi takdirde, yöntemi bulmak ve çağırmak için yansımayı kullanın. döküm noktasının parçası olarak, mantıklı değil bir yürütme zamanı türüne göre

Temelde döküm ... derleyici daha fazla bilgi vermek ve sadece bu yok bu durum.

İlk seçenek, bunu başarırsanız, en uzak olanıdır.

+1

Bağımlılık Enjeksiyon –

+1

Bağımlılık Enjeksiyon Arabirimler/Özet temel sınıf? Nasıl? Arayüzler tanımlanabilirse, senaryo ilk yeterlidir – Tilak

+0

Bir arayüzün aksine bir taban sınıfı daha iyi olmaz mıydı? Bu bir * can-do * (arayüz) 'in aksine bir * is-a * (soyut sınıf)' dir. Türlerin tabiatında benzer olduğu varsayımı – mattytommo

0

Ben CreatInstanceB() aslında MyClassB kullanması gerektiğini varsayalım?

((MyClassA)obj).Initialize(); 

...

((MyClassB)obj).Initialize(); 

Yoksa bir Initialize yöntemi vardır bir arabirim bulunmak ve o arayüz olarak obj tanımlayabiliriz:

Hangi durumda kullanabilirsiniz.

+0

bence, başlangıç ​​yönteminde MyClassA veya MyClassB bilinmemektedir, buradaki soru – Tilak

+0

Evet, haklısınız. Soruyu düzenledim. @JonSkeet'in önerdiği gibi "dinamik" anahtar kelimesini kullanmalıyım. – Leri

+0

Doğru, bunu kaçırdı. Bay Skeet'e her zaman güvenebiliriz. – Slugart

İlgili konular