2010-05-28 29 views
5

Herhangi bir nesne için genel bir sarıcı oluşturmanın bir yolunu arıyorum.
Sarıcı nesnesi tıpkı sardığı sınıf gibi davranır, ancak daha fazla özellik, değişken, yöntem vb. Nesne sayımı, önbelleğe almaC# nesneler için sarıcı

sarmalayıcı sınıf Sarıcı adlandırılabilir ki vs. ve sınıf kare adlandırılabilir sarılmış ve kurucu kare (çift edge_len) sahip olması özellikleri/yöntemleri EdgeLength ve Alan, ben şöyle kullanmak istiyorum:, i

Wrapper<Square> mySquare = new Wrapper<Square>(2.5); /* or */ new Square(2.5); 
Console.Write("Edge {0} -> Area {1}", mySquare.EdgeLength, mySquare.Area); 

Açıkçası ben sarmak istiyorum her sınıf için böyle bir sarmalayıcı sınıf oluşturabilirsiniz, ancak ben genel çözüm arıyorum. Hem ilkel hem de bileşik tiplerini çalıştırabilen e. Wrapper<T> (şimdiki durumumda kendi sınıflarımı sarmakla mutlu olurum).

Öneriler?

Teşekkürler.

+0

Bunu C# ile 3,0 yapamazsınız. Bununla birlikte, Sürüm 4.0, bunu yeni dinamik tip sistem üzerinden yapmanıza izin verebilir. –

+0

Lütfen detaylandırır mısınız? Teşekkürler. – Haggai

cevap

2

DynamicProxy sizin için bir çözüm olabilir.

+1

+1, evet - soru açıkça bir proxy uygulaması arıyor. DynamicProxy, .NET açık kaynak dünyasında yaygın olarak kullanılmaktadır (NMock2, NHibernate, Ninject, vb. Hepsi kullanmaktadır). Tek önemli uyarı, mühürlü sınıflar için bir proxy kullanamayacağınızdır. –

+0

Teşekkürler! Bu gerçekten aradığım çözüm gibi görünüyor (buna rağmen daha fazla kazmak zorunda kalacağım). – Haggai

4

Decorator pattern kullanın veya extension methods yazın. Böyle

+1

Teşekkürler. Dekoratör kalıpları uygun değil, bence, tüm programımı kullanmamı istediğimden ve T sarmalayıcıyı kullanıcı için şeffaf olmasını istiyorum. Uzatma yöntemleri ile ilgili olarak - sınıfa değişken (yani her bir nesneye)? Ya da sadece yöntemleri? – Haggai

2

Belki bir şey:

public class Wrapper<T> 
{ 
    public readonly T Object; 

    public Wrapper(T t) 
    { 
     Object = t; 
    } 
} 

Ve aşağıdaki gibi o zaman bunu kullanabilirsiniz: Kale projesinden

Wrapper<Square> mySquare = new Wrapper<Square>(new Square(2.5)); 
Console.Write("Edge {0} -> Area {1}", mySquare.Object.EdgeLength, mySquare.Object.Area); 
+0

Teşekkürler, ama bundan kaçınmaya çalışıyorum. Sarıcının T kullanıcı kullanıcısına şeffaf olmasını isterim. – Haggai

+0

Bu Cevap bana çok yardımcı oluyor: D – Krishan