21 Eylül 2015 Pazartesi

Reflection ile Nesne Yaratmak

Not : Konuyla ilgili olarak Reflection ile Arayüzleri Bulmak başlıklı yazıya göz atabilirsiniz.

Giriş
Reflection geniş bir konu olduğu için okunabilirlik adına konuları belli başlıkla altında toplamayı uygun buldum.

Java
Reflection ile Nesne Yaratmak yazısına taşıdım.

C#
Assembly'ye Erişmek
Doğru Assembly'yi bulmak için yükleme denenebilir.
Assembly myassembly = Assembly.LoadFile(myassemblypath);
veya zaten yüklü ise
AppDomain.CurrentDomain.GetAssemblies()
ile doğru Assembly bulunabilir. AppDomain çalışma esnasında yüklenebilir veya kaldırılabilir.

Activator Sınıfı
CreateInstance metodu

Bir type ile nesne yaratmak
Bu metod hep type ile hem de generics ile çalışıyor.
Type ile çalışanı şöyle
Activator.CreateInstance(typeof(MyClass));
Generics ile çalışanı şöyle
Activator.CreateInstance<MyClass>()
Generics ile çalışanı daha hızlı ama pek kullanıldığını görmedim. Ben type ile çalışanı hakkında yazacağım.
Örnek:
var testVar = 123;
var genType = typeof(MyClass<>).MakeGenericType(testVar.GetType());
var genInstance = Activator.CreateInstance(genType);
Console.WriteLine(genInstance.GetType().FullName);

Assembly içindeki IMyType arayüzden türeyen tüm sınıfların nesneleri yaratılıyor.
List<IStringType> types = new List<IStringType>();
            types.AddRange(from assembly in AppDomain.CurrentDomain.GetAssemblies()
                           from t in assembly.GetTypes()
                           where t.IsClass && t.GetInterfaces().Contains(typeof(IMyType))
                           select Activator.CreateInstance(t) as IMyType);
Assembly içindeki MyType sınıfından türeyen tipler bulunuyor.
Assembly myassembly = Assembly.LoadFile(myassemblypath);
List<Type> types = myassembly.GetTypes().Where(x => x.BaseType == typeof(MyType));

İsim ile nesne yaratmak (1)
Not : .Net ile çalışırken typeName denilince sınıfın namespace artı ismi akla gelmeli. Bazen assembly içinde <>c.... şeklinde başlayan sınıflar görülebilir. Bu sınıfle derleyici tarafından üretilen anonim sınıflardır.

Bu yöntemi hiç kullanmadım. Bence pek tercih edilmemeli.
Belirtilen assembly içindeki sınıfın default constructor'ını kullanarak nesne yaratır. Metodun imzası şöyle
public static ObjectHandle CreateInstance(
  string assemblyName,
  string typeName
)
Ben assembly name'inin çok karışık olmasından şikayetçiyim
var assemblyName =
    "System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089";

var typeName = "System.Net.WebClient";

var instance = Activator.CreateInstance(assemblyName, typeName).Unwrap();

İsim ile nesne yaratmak (2)
Bu yöntem daha kolay. Type.GetType ile bir başka assembly içindeki nesnenin type'ı alınır.
Activator.CreateInstance(Type.GetType("mynamespace."+ classname + ". myDLL",true)); 
Automation ile nesne yaratmak 
Örnek:
dynamic ie = Activator.CreateInstance(Type.
GetTypeFromProgID("InternetExplorer.Application"));

ie.AddressBar = false;
ie.MenuBar = false;
ie.ToolBar = false;

ie.Visible = true;
ie.Navigate("www.google.com");
Automation ile nesne yaratmak (2)
Örnek
Guid CLSID = new Guid("A5B020FD-E04B-4e67-B65A-E7DEED25B2CF");
var manager = (IExample)Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID));

Assembly Sınıfı
Bu sınıf ta Activator gibi nesne yaratabiliyor.
CreateInstance metodu
string className = "myfullyqualifiedclassname";
System.Reflection.Assembly.GetExecutingAsembly().CreateInstance (className); 



Hiç yorum yok:

Yorum Gönder