2009-06-23 70 views
5

yılında .NET 'Tür' sınıfı alternatif (2009 - ben genel sözlük sınıfı var), C# koduna benzer bir şey:Ben Delphi yazmak istiyorum Delphi

Dictionary<Type, Object> d = new Dictionary<Type, Object>(); 
d.Add(typeof(ISomeInterface), new SomeImplementation()); 
object myObject = d[typeof(ISomeInterface)]; 

Herhangi bir fikir? peşin

sayesinde arabirimler için

Hristo

cevap

9

, sen derleyici sihirli fonksiyon typeinfo tarafından döndürülen bir PTypeInfo işaretçisi, kullanmak isteyeceksiniz. PTypeInfo, TypInfo biriminde bildirilmiştir.

type 
    TInterfaceDictionary = TObjectDictionary<PTypeInfo, TObject>; 
var 
    d: TInterfaceDictionary; 
    myObject: TSomeImplementation; 
begin 
    d := TInterfaceDictionary.Create([doOwnsValues]); 
    d.Add(TypeInfo(ISomeInterface), TSomeImplementation.Create()); 
    myObject = d[TypeInfo(ISomeInterface)]; 
end; 

Elbette, bu, arabirimler yerine sınıflar olsaydı, bir TClass referansı kullanabilirsiniz. aslında bir TInterfaceDictionary ise

+0

sayesinde, Mason. Aradığım çözüm bu. Aslında Kayıt Defteri tasarım deseninin basit bir uygulamasını oluşturacağım ve kodumun şu gibi bir şey görmesini istiyorum: Registry.RegisterComponent (TSomeImplementation.Create); // veya belki de: RegisterComponent (TSomeImplementation); . . . ISomeInterface i: = Kayıt defteri.GetComponent ; @ Uwe Raabe: Bunun mümkün olduğunu bilmek ilginç ancak benim durumumda arayüzlerin GUID'si yok. –

+0

Bir yan not olarak, geçen ay Delphi Live konferansındaydım ve Barry Kelly, Delphi 2010'da olması gereken yeni geliştirilmiş bir RTTI modeliyle ilgili bir sunum yaptı. Mevcut fonksiyon setinden çok daha eksiksiz ve çok ile çalışmak daha kolay. –

6

bunu şöyle yazabiliriz:

type 
    TInterfaceDictionary = TObjectDictionary<TGUID, TObject>; 

Açıkçası bu, her arayüz kullanmak için bir GUID gerektirir.

bazı derleyici sihirli Sizin oldukça basit kullanabilirsiniz nedeniyle:

d.Add(ISomeInterface, TSomeImplementation.Create()); 

(Mason: örnek kod kaçırma için üzgün)

+0

Huh. Bunu düşünmemiştim. Evet, bu özellikle GUID'lerle arayüzler için çalışır. –