2009-01-23 17 views
5

Hepsi aynı şekilde oluşturulmuş ve gereksiz kodu azaltmak için bir yöntem çağırmak istiyorum, bir dize (çocuk düğüm adı) geçmek için bir sürü MDI çocuk düğümleri var , düğümü oluşturup onu ebeveyne ekleyin.Fabrika Modeli C#

Sınıfın bir dizesinden bir dizi oluşturmak dışında tüm öğeleri yapabilirim, bunu nasıl yapabilirim?

cevap

6

sınıf

public static IMobileAdapter CreateAdapter(Type AdapterType) 
{ 
    return (IMobileAdapter)System.Activator.CreateInstance(AdapterType); 
} 

O IMobileAdapter uygulayan bir sınıfın örneğini döndürüyor, ancak bir dize ile eşit kolayca kullanabilirsiniz kadar yeni:

public static IMyClassInterface CreateClass(string MyClassType) 
{ 
    return (IMyClassInterface)System.Activator.CreateInstance(Type.GetType(MyClassType)); 
} 

Çağrı onu aşağıdakine benzer bir kod kullanarak: cours Of

IMyClassInterface myInst = CreateClass("MyNamespace.MyClass, MyAssembly"); 

e, yarattığı sınıf bu durumda IMyClassInterface arabirimini uygulamalıdır, ancak bir sınıf fabrikasıyla, muhtemelen tüm sınıflarınız aynı arabirimi uygular.

Düzenleme: Yorumunuza istinaden

, bu tartışmanın amacı için, sizin vb/cs proje içinde dosyaların kümesi olarak dönem "montaj" düşünüyorum. Bunu tek bir projede [derleme] yaptığınızı ve birden fazla projeye yayılmadığınızı varsayıyorum.

Sınıflarınız Form nesnesini genişletirken sizin durumunuzda böyle bir şey yaparsınız.

Form myInst = CreateClass("MyExtendedForm"); 

Ya da CreateClass yöntemi içinde ya da dışında türünü olsun olmadığına bağlı

Form myInst = CreateClass(Type.GetType("MyExtendedForm")); 

. Herhangi bir özel üyeye erişmek için örneğinizi doğru türe atamanız gerekir. Bunu düşünün:

class MyCustomForm : Form 
{ 
    public int myCustomField{ get; set; } 
} 

Formumun myCustomField özelliğini ekleyen bir özel formum var. I) (bu kullanarak Activator.CreateInstance örneğini istiyorum:

public static Form CreateClass(string InstanceName) 
{ 
    return (Form)System.Activator.CreateInstance(Type.GetType(InstanceName)); 
} 

Sonra kullanarak çağrı:

Form myInst = CreateClass("MyCustomForm"); 

Şimdi ben özel form myinst sakladığınız. Ancak, özel mülkiyet [myCustomField] erişmek için, doğru forma senin örneğini döküm gerekir:

int someVal = ((Type.GetType("MyCustomForm"))myInst).myCustomField; 
+0

Tüm sınıflar Formu uzanır. Bir montajın ne olduğunu açıklamak ister misiniz? – Malfist

0

Sınıfın adı olan bir dizeniz varsa, Type.GetType (string) öğesini çağırarak bir Type nesnesini buradan alabilmeniz gerekir. Bu türden, bir nesneyi oluşturmak için yansımayı kullanabilmeniz gerekir. Şu anda benim uygulamalardan birinde bu kullanıyorum

3
Activator.CreateInstance(Type.GetType(typeName))