2009-03-17 22 views
5

Nesnelerin listesi için bir dosya sorgulamak için LINQ-to-XML kullanıyorum. Hepsi aynı yapıya sahiptir (bir dizi seçenek, belirsiz uzunlukta bir parametre listesi). XML dosyasındaki isimlerine dayanarak, parametreleri tamamen farklı şeyler için kullanmak istiyorum - bu yüzden bu nesnenin alt sınıflarını yaptım. Ben bir vaka bildirimi gibi bir şey yapmadan, dinamik olarak doğru inşa edici çağırmak nasıl -C# 'da bir kurucuyu dinamik olarak nasıl dinleyebilirim?

Sorum şu? Ya da XML'den farklı alt sınıfları zarif bir şekilde örnek almanın çözümü başka yerde mi yatıyor?

class Object1 
{ 
    string name; 
    OptionObj opt; 
    List<Param> parameters; 
} 

class sonOfObject : Object1 
{ 
    public void ExecuteSomething() 
    { 
     //do something with the parameters 
    } 
} 

class secondSonOfObject : Object1 
{ 
    public void ExecuteSomething() 
    { 
     //do something entirely different with the parameters 
    } 
} 

var query = from x in xmlDoc.Descendants("Object") 
    select new Object 
    { 
     //select the object from the XML 
    } 

bu kod biraz sonra ben daha genel sorgu nesneden sonOfObject yapmak için bir kopya kurucu kullanabilirsiniz. Ama bunu dinamik olarak, çocuk sınıfının ismine göre nasıl yaparım?

Sana bir türünden MethodInfo almak ve ala çağırmak biliyorum ...

MethodInfo m = t.GetMethod(someName); 
m.Invoke(yourObj, null); 

Ama bu 9 ya bu çocuk sınıf nesnelerinin 10 örneğini zorunda kalacak anlamına (ve türünü alacağı her biri için) ve hala bir çeşit dava cümlesiyle sonuçlanır.

dinamik çocuk sınıf kurucular çağırmak için daha şık bir yolu var mı?

cevap

3

.

Bu öznitelikle işaretlenen tüm Type işaretlerini bulmak için yansımayı kullanın ve bunları Dictionary<string, Type> ürününe yerleştirin. Bu noktada, sisteme katkıda bulunabilecek başka meclisleri nasıl bulacağınıza karar vermelisiniz. Basit bir yaklaşım, aynı dizinde .DLL uzantılı diğer dosyaları aramaktır.

O zaman sadece adıyla Dictionary yılında Type aramak ve Type.GetConstructor ve ConstructorInfo.Invoke çağrı, ilgili Type bir örneğini oluşturmak için kullanmak istediğiniz XML dizesi var her.

bu avantajı XML tanımlayıcı kod fiziksel düzeni ayrılmış olmasıdır - Eğer meclislerinde etrafında türlerini taşımak veya eski XML dosyalarını geçersiz kılmadan yeniden adlandırabilirsiniz.

+0

1 OP yeniden okuduktan sonra bu gerçekten iyi bir çözüm olduğuna inanıyoruz. –

7

Activator.CreateInstance bir dize olarak bir sınıf adında geçmek ve bu size bu sınıfın yeni bir örneğini döndürür sağlar. sipariş bir sınıfı bu planın bir parçası olmak için, bunu bir "XML adı" veren özel ayrıntı ile işaretlemek istiyorum yılında

İlgili konular