2013-07-24 20 views
7

Başka türden yüklenebilir bir T türünü sınırlamak için C# jenerik ile bir yolu var mı?C# Tür için geçerli genel kısıtlama

Örnek:
Ben string olarak kayıt bilgilerini kaydetme am Sağlar ki, ben bilgiyi geri zaman böyle bir şey görünen bir işleve sahip istiyorum:

static T GetObjectFromRegistry<T>(string regPath) where T castable from string 
{ 
    string regValue = //Getting the regisstry value... 
    T objectValue = (T)regValue; 
    return objectValue ; 
} 
+1

Ben Türleri derleme zamanında belirlenir fark .NET –

cevap

4

.NET kısıtların böyle türü yoktur - Kendine has taban veya çocuk sınıfına

Ref nesne artığını mümkündür.

  • where T: struct tip argüman
  • where T: class tip argüman
  • where T: new() tip argüman bir kamu parametresiz yapıcı olması gerekir bir başvuru türü olması gereken bir değer türü olmalıdır: mevcut kısıtlamalar sadece altı türleri (Constraints on Type Parameters bakınız) mevcuttur
  • where T: <base class name> tür bağımsız değişkeni
  • where T: <interface name> tipi argüman veya belirtilen interfa uygulamak gerekir olabilir ya da belirli bir taban sınıfından türetilmesi gerekir T için verilen ce
  • where T: U tip argüman veya ilk itiraz döküm yapabilirsiniz, kendi türüne dize döküm istiyorsanız U

için verilen argüman türetilmesi gerekir. Ama emin olmak için tip parametre üzerinde kısıtlamayı koyamazsınız bu döküm oluşabilir: -

static T GetObjectFromRegistry<T>(string regPath) 
{ 
    string regValue = //Getting the regisstry value... 
    T objectValue = (T)(object)regValue; 
    return objectValue ; 
} 

Başka bir seçenek arayüzünü oluşturun:

public interface IInitializable 
{ 
    void InitFrom(string s); 
} 

Ve sınırlama olarak koydu:

static T GetObjectFromRegistry<T>(string regPath) 
    where T: IInitializable, new() 
{ 
    string regValue = //Getting the regisstry value... 
    T objectValue = new T(); 
    objectValue.InitFrom(regValue); 
    return objectValue ; 
} 
0

Türleri derleme sırasında belirlenir. Çalışma zamanı sırasında türleri değiştiremezsiniz.

Difference between object a = new Dog() vs Dog a = new Dog()

+0

böyle bir kısıtlama yoktur .ToString() (YMMV) üzerinden, yine String için "dökümü yapılabilir" dir. ancak derleme zamanında, şimdi fonksiyona aktarılan tip referansı da yapabilirsiniz. (aynı şekilde. string a = "abc", a [0] çalışacakken (nesne olarak) [0] olmaz) Bu yüzden sorunun nasıl yanıtlandığını anlamıyorum. –

0

Kısıtlamalar, "T türünün U tipinde veya U tipinde mi" olması gerektiği gibi heceleniyor, dolayısıyla aradığınız kısıtlama yapılamaz.

herşey

+0

* * YMMV açıkladı: ** '.ToString()' az ya da çok dahili hata ayıklama özelliği. "[Bir nesneyi dize gösterimine dönüştürür, böylece görüntüleme için uygundur.] (Https://msdn.microsoft.com/en-us/library/system.object.tostring.aspX)" - MSDN. (Ab-) döküm için kullanmamaya şiddetle tavsiye ediyorum. – FooBarTheLittle

İlgili konular