2011-06-03 18 views
5

Nesne türünün [nesnenin adı] bir dize değişkeni olarak geçirildiği bir gereksinim var. Artık, aktarılan nesne adına bağlı olarak, bu nesne türünü oluşturmam gerekiyor. Dize değerinin tam nesne tipi adını içerdiğini lütfen unutmayın. Bir kod parçacığı yazdım ama bir istisna atıyor.Bir nesneyi C# olarak iletilen dize değerine göre bir türe dönüştürün. #

örneğin ->Object must implement IConvertible.

Benim varlık OrderEntity zaten IConvertible arayüzünü uygulamıştır -

string objectName = "EntityTest.Entity.OrderEntity";//Entity type name 
object obj = new object(); 
object newobj = new object(); 
newobj = Convert.ChangeType(obj, Type.GetType(objectName)); 

Bu hata olsun.

Herhangi bir yardım/öneri çok takdir edilmektedir. Gereksinimi yerine getirmek için nesneyi oluşturabileceğim başka bir yol var mı?

cevap

3

Sorununuz, bir örnek oluşturmak için object örneğidir ve sonra bunu daha spesifik bir türe (bu olmamakla birlikte) yazmaya çalıştığınızdır.

Oluşturmaya çalıştığınız türde varsayılan yapıcıyı çağırmak için bir yol kullanmanız gerekir. Activator.CreateInstance() bir göz atın: türünün varsayılan kurucu sahiptir

var type = Type.GetType(typeName); 
var instance = Activator.CreateInstance(type); 

, yukarıdaki örnek başarısız olur. Bu durumda, en iyi bahis ziyade, (yani yapıcı parametreleri olarak kullanmak nesneleri dizisi alır ve sonra en iyi eşleşmeyi bulmaya çalışır) Şu anda bir mevcut nesneyi dönüştürmek için çalışıyoruz

9

use this overload muhtemelen Doğru tiplerden birini yaratıyor. senin Type.GetType çağrı çalışıyor varsayarsak, sadece kullanabilirsiniz:

Type type = Type.GetType(objectName); 
object x = Activator.CreateInstance(type); 

birkaç nokta not:

  • Type.GetType(string) tip an çalışmakta ya olan sürece bir derleme nitelikli adını gerektirir montaj veya mscorlib
  • Activator.CreateInstance(Type) parametresiz yapıcıyı (erişilebilir olması gereken) arayacaktır; Yapıcıya argümanları iletmeniz gerekirse, other overloads kullanılabilir.
+0

Bu harika ama sonra yeni oluşturulan nesneye nasıl değer aktarıyoruz? –

+0

@HamedZakeryMiab: Parametreli bir kurucu çağırmak istediğiniz anlamına mı geliyor? 'Type.GetConstructors() 'çağırabilir, doğru yapıcıyı bulabilir ve onu çalıştırabilir veya argümanlar belirtmenize izin veren' Activator.CreateInstance' için aşırı yüklenmelerden birini kullanabilirsiniz. Bunları dene ve sorun yaşarsan yeni bir soru başlat. –

İlgili konular