Aklımda Kalası Kelimeler

* давайте работать вместе
* Zarf ve Mazruf, Zerafet(xHoyratlık) ile aynı kökten(za-ra-fe) gelir
* Bedesten
* Suç subuta ermiştir - Suç sabit olmuştur

9 Temmuz 2011 Cumartesi

Reflection ile sınıf yapısını çıkartmak, nesne üretmek ve üstünden metot çağırmak

Reflect edeceğimiz sınıfımız:

public class A
{
public A() { }
public A(int _i, byte _b) { }
private void Carp(int _i, byte _b) { }
public int Topla(int _i, byte _b)
{
return _i + _b;
}
}




using System;
using System.Linq;
using System.Reflection;

namespace ConsoleApplication5
{
class Program
{
static void Main(string[] args)
{
Assembly asm = Assembly.LoadFrom(@"C:\Users\cem\Documents\visual studio 2010\Projects\ConsoleApplication5\LibOrnek\bin\Debug\LibOrnek.dll");
Type[] asmTipleri = asm.GetTypes();

#region Assembly içindeki sınıf içinden yapıcı metotların imzasını çekme
// ornekAssembly.exe içinde bir çok sınıf olduğunu düşünelim
foreach (Type sinif in asmTipleri)
{
Console.Write(sinif.IsClass ? "class " : "abstract class ");
Console.WriteLine(sinif.Name + " {");

// Bu sınıfın yapıcı metotlarını çekelim
foreach (ConstructorInfo ctor in sinif.GetConstructors())
{
Console.Write("\t" + sinif.Name + "(");
// Yapıcı da olsa metot metottur ve parametreleri var mı diye bakalım.
foreach (ParameterInfo param in ctor.GetParameters())
{
// SinifAdi(string _paramAdi1, int _paramAdi2)
Console.Write(param.ParameterType.Name + " " + param.Name + ",");
}
Console.WriteLine(") { }");
}

// DeclaredOnly : Yalnızca sınıf içinde tanımlı olan metotlar. Kalıtımla gelenler hariç,
// Instance : Nesnelerin metotları,
// NonPublic : Public olmayan metotları,
// Public : Public metotları,
// Static : Static metotları ÇEKECEK.
MethodInfo[] metotlar = sinif.GetMethods(BindingFlags.DeclaredOnly
| BindingFlags.Instance
| BindingFlags.NonPublic
| BindingFlags.Public
| BindingFlags.Static);

foreach (MethodInfo metod in metotlar)
{
Console.Write("\t" + (metod.IsPrivate ? "private " : metod.IsPublic ? "public " : "") + metod.ReturnType.Name + " " + metod.Name + "(");
foreach (ParameterInfo param in metod.GetParameters())
{
// DönüşTipiAdı MetotAdı (ParamTipi paramAdi, ParamTipi paramAdi2) { }
Console.Write(param.ParameterType.Name + " " + param.Name + ", ");
}
Console.WriteLine(") { } ");
}
Console.WriteLine("}");
}

#endregion
/*
* Buraya kadarki çıktı:

class A {
A() { }
A(Int32 _i,Byte _b,) { }
private Void Carp(Int32 _i, Byte _b, ) { }
public Int32 Topla(Int32 _i, Byte _b, ) { }
}
*/

// Metot çağırmak:
object[] _params = new object[2];
_params[0] = 15;
_params[1] = (byte)20;
Type tip = asm.GetType("A");
MethodInfo miTopla = tip.GetMethod("Topla");

object objSinifOrnegi = tip.GetConstructors()[0].Invoke(null);
object sonuc = miTopla.Invoke(objSinifOrnegi, _params);

Console.WriteLine("\n\t Toplama Sonucu: " + sonuc);


/*
* Çıktımız:
class A {
A() { }
A(Int32 _i,Byte _b,) { }
private Void Carp(Int32 _i, Byte _b, ) { }
public Int32 Topla(Int32 _i, Byte _b, ) { }
}

Toplama Sonucu: 35
*/

Console.ReadLine();
}
}
}


Activator ile obje yaratmak:
        object obj = Activator.CreateInstance("deneme, Version=0.0.0.0, Culture=neutral, PublicKeyToken=dc5cbb4d7c01cc5e", "Service1").Unwrap();
Type tip = obj.GetType();
MethodInfo miTopla = tip.GetMethod("HelloWorld");