Bir özel durumdan kaçınmak istediğimden, bir türün parametresiz bir kurucu olup olmadığını kontrol etmek istiyorum. Bunu nasıl başarabilirim?Parametre oluşturucu için bir tür nasıl kontrol edilir?
Böyle bir şey gerekir:
bool HasDefaultConstructor<TT>(TT source)
{
return ???;
}
DÜZENLEME: Ben kaynakla aynı türde bir nesne oluşturmak istediğiniz ve değil onun yerine varsayılan (TT) kullanmak istediğiniz bir varsayılan kurucu varsa.
static TT CreateObject<TT>(TT source)
{
try
{
if(!HasDefaultConstructor<TT>(source))
{
return default(TT);
}
return (TT)Activator.CreateInstance(source.GetType());
}
catch(Exception ex)
{
Trace.WriteLine("Exception catched!\r\n" + ex);
}
return default(TT);
}
static bool HasDefaultConstructor<TT>(TT source)
{
ConstructorInfo c = typeof(TT).GetConstructor(new Type[] { });
return c != null;
}
Ama çek bana gerçek verir ve Createınstance istisna
yok parametresiz oluşturucu
Çözüm atar:
Ya şimdi var olan
bool HasDefaultConstructor(Type t)
{
return t.GetConstructor(Type.EmptyTypes) != null;
}
Bu şekilde birçok özyinelemeli işlev ve yineleme söz konusuydu ve bu şekilde bir yere HasDefaultConstructor (tip nesnesiyle) yanlış genel işlevi çağrıldı. Jenerik olmayan bir işlev kullanmak hile yaptı.
Yapıcı yardımlarınız için hepinize teşekkür ederiz.
Sorunuzu netleştirmek edin - nasıl inşa edici çağırmak istersin? Parametre olmayan bir kurucu yoksa bir istisna beklediğiniz için, 'TT' için belirtilen türün böyle bir kurucuya sahip olmasa bile kodun yine de derlenebilir olmasını istiyorsunuz. –
Varsayılan kurucu yoksa, onun yerine varsayılan (TT) kullanmak istiyorum. – MTR
Aha! Öyleyse lütfen sorunuzdaki bilgileri ekleyin.Sorunun anlamını önemli ölçüde değiştirir ve 'new()' jenerik kısıtlaması geçersiz olan herhangi bir cevap verir. –