Özet - Reflection
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
-
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.
-
Metodu amacına eşle
- typeof(T)
- Type alır
- Activator.CreateInstance
- Örnek üretir
- MethodInfo.Invoke
- Metot çağırır
- PropertyInfo.GetValue
- Özellik okur