Bir Türden yeni bir nesne örneği nasıl oluşturulur

Derleme zamanında bir nesnenin Tipi her zaman bilinmeyebilir, ancak Tipin bir örneğini oluşturmak gerekebilir. Bir Typedan yeni bir nesne örneğini nasıl elde edersiniz?

Çözüm

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");
Yorumlar (6)

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()
{
    try
    {
        return (T)typeof(T).GetConstructor(new Type[] { }).Invoke(new object[] { });
    }
    catch
    {
        return default(T);
    }
}
Yorumlar (1)

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.

Yorumlar (1)