2016-03-22 11 views
1

olarak sınırlandırılıyor C# jenerik parametresine bir sınırlama belirtilebilir, burada bu parametrenin soyut olması gerekir? Şu anda jenerik parametresinin parametresiz bir kurucuya sahip olması gereken bir yöntemim var ancak şimdi soyut bir T'ye gereksinim duyduğum bir senaryoda çalışıyorum. Bu nedenle, yöntemi yalnızca soyut olarak kabul eden bir yöntemle aşırı yükleyeceğini umuyordumGenel parametre

public static void SomeMethod<T>(IEnumberable<T> SomeParam) where T:SomeBase, new() 
{ 
    T tThing = new T(); 
    //do something simple 
} 
public static T SomeOtherMethod<T>(IEnumberable<T> SomeParam) where T:SomeBase, new() 
{ 
    T tThing = new T(); 
    //do something simple 
} 

public static void SomeMethod<T>(IEnumberable<T> SomeParam) where T:SomeBase, abstract() 
{ 
//do something clever 
} 
public static T SomeOtherMethod<T>(IEnumberable<T> SomeParam) where T:SomeBase, abstract() 
{ 
//do something clever 
} 

Şüphelendiğim gibi, yanıt "bunu yapamazsınız" ise, mantıklı bir çözüm var mı?

+4

- ve size soyut bir kısıtlamayı gerektiğini düşünüyorum bunu yapmak istediğini belli değil onun. Soyut olan bir sınıfa (örneğin, kodunuzdaki 'SomeBase') sınırlama yapabilirsiniz. – Jamiec

+2

Yeni sınırlama, değer veya referans türünüzün olup olmadığını belirlemek için basitçe vardır. Ancak soyut bir kısıtlama için pratik bir kullanım göremiyorum. IEnumerable 'ın ne gibi yararları var ki,' IEnumerable 'da buna sahip değil misiniz? – HimBromBeere

+1

* SomeBase * 'i yeni bir özet sınıfına miras bırakıp * T: NewAbstractClass *' ı kullanarak nasıl? – bit

cevap

3

Derleyiciye, type parametresinin soyut olup olmadığını kontrol etmesi için talimat veremezsiniz. Ama bir çalışma zamanı kontrolü yapabilirsin.

public static void SomeMethod<T>(IEnumerable<T> SomeParam) where T:SomeBase 
{ 
    Type type = typeof(T); 
    if(type.IsAbstract) 
    { 
     throw new Exception(string.Format("Cannot use SomeMethod with type {0} because it is abstract.", type.FullName)); 
    } 

    // Do the actual work 
} 

Veya: Orada soyut hiçbir sınırlamadır

public static void SomeMethod<T>(IEnumerable<T> SomeParam) where T:SomeBase 
{ 
    Type type = typeof(T); 
    if(type.IsAbstract) 
    { 
     SomeMethodAbstract<T>(SomeParam); 
    } 
    else 
    { 
     SomeMethodNonAbstract<T>(SomeParam); 
    } 
} 
+0

Bu işe yarayabilir – DJL