2016-04-10 23 views
0

'a taşımak istemiyor Bir COM API'si sarıyorum. Genel olarak, bazı jenerik sınıfları tasarlamada ve test edilen parçaları bu sınıflara çekerek iyi şanslar elde ettim.Yöntem, Genel Sınıf

İşte bana bir sorun veren. Sonuç kümelerini temsil eden sınıflar var. Miras almazlar, ortak bir arayüz uygularlar, ancak çok basit bir arayüzdür. ResultSet işlevini, özellikle .COUNT veya .GetAt (i)

açığa çıkarmayacağım Çözümüm bunu bir TALİMATLIK yapmak ve benim için işi yapmak için CodeSmith kullanmaktır. Dünyanın sonu değil. Varlık başına üretilen 13 kod daha.

Bunu köprüleyebileceğim bir sınıfla ve bunun üstesinden gelebilecek bir arabirimle oynadım, ancak sonuç kümesini temsil eden API'da ortak bir 'şey' olmadığı gerçeğine geri dönüyorum.

Bir şeyleri kaçırıyor olabilirim, kesinlikle çözümü görmüyorum.

Ben Generic bu işlevi taşımak istiyoruz etrafında

aşağıda listelenmiştir işin bir örneği için kodu. Şu anda jenerik kullanan sınıfın her örneğinde oturur.

ICustomerRetList, IBase'den devralınır. IBase, yukarıda belirtildiği gibi .Count veya .GetAt() 'a sahip değildir.

sorum Clear- olmak şudur: Eğer tüm uygulamaları arasında ise bana jenerik sınıfa

Public Overrides Function RetListToList(RetList As ICustomerRetList) As List(Of Customer) 
    Dim oItem As ICustomerRet 
    Dim oItem As Customer 
    Dim l As New List(Of Customer) 

    For idx = 0 To RetList.**Count** - 1 '.Count is not a member of IBase 
     oqbItem = RetList.**GetAt**(idx) '.GetAt() is not a member of IBase 
     oItem = New Customer() 

     'add the Item to the list 
     Call l.Add(oItem) 
    Next 
    Return l 
End Function 
+1

ICustomerRetList nasıl uygulanır? Bu yöntemleri neden bu arayüze eklemiyorsunuz? –

+0

@Gosha, İlginiz için teşekkürler. Bu, paketlediğim bir 3. parti API'sı. Değişime açık değil. Soruyu cevaplamak için, bir dll içinde uygulanan bir COM Arayüzüdür. Tekrar teşekkürler. – greg

+1

Aynı adı kullanırlarsa, yöntemi çalışma zamanı nesne türünden almak için yansımayı kullanan bir Uzantı Yöntemi kullanabilirsiniz. Bunun üretilmesinden daha iyi bir çözüm olacağını emin değilim. – user1937198

cevap

1

aşağı, benim beton sınıfından bu işlevi hareket sağlayacak bir vb yapısını önerebilir IBase bu metotlara sahiptir ve hepsi aynı isimlere sahiptir, fonksiyonları etkili bir şekilde indirmek için uzatma yöntemlerini ve yansımayı birleştirebilirsiniz.

Public Class CustomerRetListExtensions 
    <Extension()> 
    Public Function GetAt(ByVal list As IBase, ByVal idx As Integer) As IBase 
     Return DirectCast(list.GetType().GetMethod("GetAt").Invoke(list, New Object() { idx }), IBase) 
    End Function 
    ' If Count is a property, otherwise use the same approach as for GetAt 
    <Extension()> 
    Public Function Count(ByVal list As IBase) As Integer 
     Return DirectCast(list.GetType().GetProperty("Count").GetValue(list), Integer) 
    End Function 
End Class 
+0

Öneriniz için teşekkürler uzantısı yöntemleri düşünmemiştim. Bu özel durumda, hala bu işi yapmak için ICustomerRet veya IVendorRet veya ..... 'a vermem gereken zorluklarla boğuşuyorum. Sanırım her bir varlık için hala bir kod bloğum var. Onu özlüyorum mu? Bunu göz önüne aldığımızda, daha net bir seçimin, düz ileriye dönük rutine sadık kalacağını düşünüyorum. – greg

+1

Döküm, yansımanın geldiği yerdir. 'GetType()', statik türden değil, nesnenin çalışma zamanı türünü alır, böylece daha sonra döküm kullanmadan yöntemleri çağırmak için 'GetMethod()' ı kullanabilirsiniz. – user1937198

+0

Tamam, yukarıdaki örnekte, IBase'i GetAt() türünde kullanabilir miyim? uzaklaşmak istediklerim ~ 80 takım uzatma metodu yazmak zorunda kalıyor. Bu noktada 2 kabaca eşdeğer çözüm meselesi haline gelir. Oluşturmam gereken kodu azaltmam, sadece değiştirmem. – greg

İlgili konular