2009-03-31 26 views
31

Genel Bir Arabirim Arabirim var ve Genel Arabirim'de bir nesnenin yapıcısını almak istiyorum.
gibi:Yapıcıda Genel Tür

public Constructor(int blah, IGenericType<T> instance) 
{} 

Ben IGenericType (Kontrol kullanımı Inversion) belirtmek için bu nesne oluşturur kod istiyorum. Bunun gerçekleşmesi için bir yol görmedim. Bunu yapmak için herhangi bir öneriniz var mı?

Birinin gibi nesne oluşturmak istiyorum: Sen kurucular jenerik yapamaz

Constructor varname = new Constructor(1, new GenericType<int>()); 

cevap

40

, ancak bunun yerine genel bir statik yöntemini kullanabilirsiniz:

public static Constructor CreateInstance<T>(int blah, IGenericType<T> instance) 

ve o zaman ne yapmak Gerekirse kurucudan sonra gerekir. Bazı durumlarda başka bir alternatif, genel ara yüzün uzandığı jenerik olmayan bir ara yüz tanıtmak olabilir.

DÜZENLEME: ... Yorumlar başı olarak

yeni oluşturulan nesnesine argüman kaydetmek istiyor ve kesinlikle yazılı şekilde yapmaya istiyorsanız

ardından tipi de jenerik olmalı . Yapıcı sorun çözülüyor Bu noktada

ancak olmayan bir jenerik tip zaten statik jenerik yöntem tutmak isteyebilirsiniz:

public static class Foo 
{ 
    public static Foo<T> CreateInstance<T>(IGenericType<T> instance) 
    { 
     return new Foo<T>(instance); 
    } 
} 

public class Foo<T> 
{ 
    public Foo(IGenericType<T> instance) 
    { 
     // Whatever 
    } 
} 

... 

IGenericType<string> x = new GenericType<string>(); 
Foo<string> noInference = new Foo<string>(x); 
Foo<string> withInference = Foo.CreateInstance(x); 
+0

isterim: böylece tür kesmesi yararlanabilirsiniz IGenericType bir üye var olarak kaydetmek istiyorum, bunu yapmak için sanırım bütün sınıf jenerikini sadece metodu değil ... – CSharpAtl

+0

Evet, bir üye değişkeni olarak güçlü bir şekilde yazılmaya ihtiyacınız varsa, o zaman tüm türün genelini yapmalı ve yapıcı problemi ortadan kalkar. –

+0

, tasarım fikrimi, temelde yapılması gereken daha iyi bir şey olup olmadığını görmek için çalıştırmamızı ister. Bu yorumda yazabileceğimi düşünmüyorum. Blogunuza gönderebilir veya size e-posta gönderebilir miyim? – CSharpAtl

İlgili konular