Derleme zamanında bir nesnenin Tip
i her zaman bilinmeyebilir, ancak Tip
in bir örneğini oluşturmak gerekebilir. Bir Type
dan yeni bir nesne örneğini nasıl elde edersiniz?
Kök System
ad alanı içindeki Activator
sınıfı oldukça güçlüdür.
Yapıcıya parametre aktarmak için çok sayıda aşırı yükleme vardır. Adresindeki belgelere göz atın:
veya (yeni yol)
İşte bazı basit örnekler:
ObjectType instance = (ObjectType)Activator.CreateInstance(objectType);
ObjectType instance = (ObjectType)Activator.CreateInstance("MyAssembly","MyNamespace.ObjectType");
Bu sorunun bir uygulaması, Type'ın parametresiz kurucusunu çağırmaya çalışmaktır:
public static object GetNewObject(Type t)
{
try
{
return t.GetConstructor(new Type[] { }).Invoke(new object[] { });
}
catch
{
return null;
}
}
İşte genel bir yöntemde yer alan aynı yaklaşım:
public static T GetNewObject<T>()
{
try
{
return (T)typeof(T).GetConstructor(new Type[] { }).Invoke(new object[] { });
}
catch
{
return default(T);
}
}
Bu, bir uygulama örneğinde çok fazla çağrılacak bir şey içinse, aktivatör veya ConstructorInfo.Invoke()
kullanmak yerine dinamik kodu derlemek ve önbelleğe almak çok daha hızlıdır. Dinamik derleme için iki kolay seçenek derlenmiş Linq Expressions veya bazı basit IL
opcodes and DynamicMethod
. Her iki şekilde de, sıkı döngüler veya çoklu çağrılara girmeye başladığınızda fark çok büyüktür.