2017-01-02 20 views
6

Benim projemde, aşağıdaki arabirimi kullanıyorum: Filter<T>.Checker<U> da arabirimi IChecker. Bu gibi görünmektedir:İç içe geçmiş Genel bir sınıf türü C genel bir sınıfta olsun C#

class Filter<T> { 

    public interface IChecker { 
     ... 
    } 

    public class Checker<U> : IChecker { 
     ... 
    } 

    List<IChecker> checkers; 

    ... 

} 

Filtre sınıfı filtre U

T. bu alanın tipi olan sınıf T farklı alanları kontrol etmek iChecker listesini kullanmaktadır tipi T nesneleri filtreler

Farklı bir sınıftaki başka bir yöntemde, bir denetleyici örneği oluşturmak istiyorum. Bu yöntemde, T'nin türü derleme zamanında bilen İşlemdir. U'nun türü sadece bir Tip örneği tarafından bilinir. Aşağıdaki kod, normalde Tür'ü bilen genel bir sınıf örneğini nasıl oluşturacağınızı gösterir.

Type type = typeof(MyObject<>).MakeGenericType(objectType); 
object myObject = Activator.CreateInstance(type); 

aşağıdaki bu biraz daha alıp yapmak istiyorum:

Type type = typeof(Filter<Transaction>.Checker<>).MakeGenericType(objectType); 
object myObject = Activator.CreateInstance(type); 

parçası typeof(Filter<Transaction>.Checker<>) derleme değil. Derleyici şöyle diyor: Unexpected use of an unbounded generic name.

C# dilinde Genel bir sınıfta yuvalanmış bir Genel sınıf türünü almak mümkün mü?

+2

zaten cevapları yayınlanmıştır eklemek için - bu [MSDN] (https üzerinde belgelerinde anlatılmış: //msdn.microsoft.com/en-us/library/system.type.makegenerictype%28v=vs.110%29.aspx). ** İç içe Tipler ** bölümünün tamamını kontrol edin, özellikle: * "İç içe tür için genel tür tanımından genel bir tür oluşturmak için, tüm kapalı türlerin tür bağımsız değişken dizilerini birleştirerek oluşturulmuş diziyle MakeGenericType yöntemini çağırın. En dış genel türden başlayıp iç içe türün kendisinin tür parametrelerine sahipse, iç içe türün tür argüman dizisiyle biter. – MarcinJuraszek

cevap

3

İyi jenerikler, tüm veya hiçbir genel argümanı belirtmenizi gerektirir. Derleme zamanında tip Transaction bilmemize rağmen

Type type = typeof(Filter<>.Checker<>).MakeGenericType(typeof(Transaction), objectType); 
object myObject = Activator.CreateInstance(type); 

, sen typeof() aracılığıyla belirtmek gerekir, ancak: derleme zamanında ikinci argüman bilmiyorum olduğundan, MakeGenericType argüman olarak her ikisi de geçmek zorunda Bu acı olmamalıdır.

is numaralı işleç üzerinden, tür bağımsız değişkenlerinin beklenen sırada uygulandığını doğrularım.

4

Burada ilk genel parametreyi T ihmal ve bir dizi olarak her iki tür geçmek zorunda düşünüyorum:

Type type = typeof(Filter<>.Checker<>).MakeGenericType(typeof(Transaction),objectType); 
İlgili konular