2009-08-15 18 views

cevap

62

, onlara varsayılan kurucu çağırmak için Activator.CreateInstance kullanabilirsiniz.

public static object GetDefaultValue(Type type) { 
    return type.IsValueType ? Activator.CreateInstance(type) : null; 
} 

Düzenleme: Jon (tabi ki) doğrudur. IsClass yeterince ayrıntılı değildir - type bir arabirimse False döndürür.

+18

Arabirimlerle başa çıkmak için, daha iyi! Type.IsValueType. –

+0

teşekkürler çocuklar! aradığım şey bu! –

1

jenerik olmadan, tip bir parametresiz yapıcı olduğunu garanti edemez, ancak yansıma kullanılarak biri arayabilirsiniz:

public static object GetDefaultValue(Type type) 
{ 
    ConstructorInfo ci = type.GetConstructor(new Type[] {}); 
    return ci.Invoke(new object[] {}); 
} 

Ben bir konsol uygulaması bu denedim ve bir sınıf varsayılarak — sınıfının "varsayılan" örneğini döndürür. Referans türleri için de çalışmak için ihtiyacınız varsa, ek bir tekniğe ihtiyacınız olacak. Eğer gerçekten sadece (referans türleri yalnızca boş olacaktır) değer türleri hakkında endişelenmenize gerek beri

+3

Referans türü için varsayılan değer boştur ve sınıfın bir örneği değildir. Bu yüzden eğer önerilerinizi yaparsa GetDefault (T) boşalır ve GetDefault (Tür) mümkünse bir örnek oluşturmaya çalışır, bu da yanlıştır. Siz tekniğiniz işe yaramıyor, ama sanırım T: new() {yeni T();} "yöntem türünü döndüren" T GetInstance (T)). – JohannesH

+0

Ne demek istediğini görüyorum. Düzeltme için teşekkürler! – harpo

+0

Cevabınız çok kullanışlıdır. – rolls

7

Normalde böyle yaparım. Bu, tüm 'IsValueType' önler ya da kurucular sorunların tümünü arar.

public static object MakeDefault(this Type type) 
{ 
    var makeDefault = typeof(ExtReflection).GetMethod("MakeDefaultGeneric"); 
    var typed = makeDefault.MakeGenericMethod(type); 
    return typed.Invoke(null, new object[] { }); 
} 

public static T MakeDefaultGeneric<T>() 
{ 
    return default(T); 
} 
+0

Bunun Mark Brackett yanıtından farklı/daha iyi/daha kötü olduğunu nasıl açıklayabilir misiniz? – rolls

+0

Bunun daha iyi ya da daha kötü olduğunu söyleyemem; Sanırım ihtiyaçlarınıza bağlı. Cevabım, hiçbir önbelleğe alma olmadan neredeyse kesinlikle daha yavaştır. Özellikle bu çözüm hakkında beğendiğim bir şey, taklit etmeye çalıştığımız yerleşik dil özelliğini kullanmasıdır; simüle etmek yerine. – jonfuller

İlgili konular