CodeBlanks Logo Icon CodeBlanks

Özet - Reflection

C# kursu · İleri seviye · Ders 48/83

Type, Activator ve Invoke'u birleştirerek basit bir DI container yazarsın.

Özet - Reflection

Bu grupta Type, Activator.CreateInstance, MethodInfo.Invoke ve PropertyInfo'yu öğrendin. Bunları birleştirerek, tip adından yola çıkıp örnek üreten ve metot çağıran basit bir DI kapsayıcı yazabilirsin.

Önce bir arayüzü uygulamaya eşleyen basit bir Container kuracaksın; sonra reflection ile dinamik metot çağrısı yapacaksın. Bu, gerçek DI kapsayıcıların ve serileştiricilerin temelidir.

Uygulama Basit DI kapsayıcı: Resolve metodu

Aşağıdaki Container sınıfında Resolve<TInterface>() metodunun gövdesini yaz. Activator.CreateInstance(map[typeof(TInterface)]) ile örnek üret ve (TInterface) ile dönüştürerek döndür. Main gövdesi tamamlanmıştır; yalnızca Resolve gövdesini doldur.

Örnek çözümü göster
return (TInterface)Activator.CreateInstance(map[typeof(TInterface)]);
Örnek çözüm:
using System;
using System.Collections.Generic;
using System.Reflection;

interface IGreeter { void Greet(); }

class HelloGreeter : IGreeter
{
    public void Greet() => Console.WriteLine("Merhaba");
}

class Container
{
    private Dictionary<Type, Type> map = new Dictionary<Type, Type>();
    public void Register<TInterface, TImpl>() where TImpl : TInterface
        => map[typeof(TInterface)] = typeof(TImpl);
    public TInterface Resolve<TInterface>()
    {
        return (TInterface)Activator.CreateInstance(map[typeof(TInterface)]);
    }
}

class Program
{
    static void Main()
    {
        Container c = new Container();
        c.Register<IGreeter, HelloGreeter>();
        IGreeter g = c.Resolve<IGreeter>();
        g.Greet();
    }
}

Uygulama Komut metodu Invoke ile çağır

Aşağıdaki Greeter sınıfında MethodInfo mi = typeof(Greeter).GetMethod("Say"); ile metodu al. mi.Invoke(g, new object[] { "Ayşe" }); ile çağır.

Örnek çözümü göster
mi.Invoke(g, new object[] { "Ayşe" });
Örnek çözüm:
using System;
using System.Reflection;

class Greeter
{
    public void Say(string name) => Console.WriteLine($"Merhaba, {name}!");
}

class Program
{
    static void Main()
    {
        Greeter g = new Greeter();
        MethodInfo mi = typeof(Greeter).GetMethod("Say");
        mi.Invoke(g, new object[] { "Ayşe" });
    }
}

Kendini test et

  1. Activator.CreateInstance ne döndürür?

    • Bir MethodInfo
    • Bir PropertyInfo
    • Bir Type nesnesi
    • Bir object örneği
    Cevabı göster

    Bir object örneği — Doğru. Activator.CreateInstance bir object örneği döndürür.

  2. Metodu amacına eşle

    typeof(T)
    Type alır
    Activator.CreateInstance
    Örnek üretir
    MethodInfo.Invoke
    Metot çağırır
    PropertyInfo.GetValue
    Özellik okur

İleri seviye bölümündeki tüm dersler