Önceki bloğumda yazdığım bir yazıyı gelen sorular üzerine buraya da yazdım. Daha Önceden okumuş arkadaşlara verdiğim rahatsızlıktan Ötürü Özür dilerim.. :)
Bugün bir arkadaşımdan email aldım, kendisi “reflection” kullanırken nasıl parametrelerden birini veya birkaçını “ref” olarak nasıl geçebileceğini soruyordu. İnternet üzerinden araştırdığı sÖyledi fakat bulamamış, kendisine emaille yardımcı oldum.
Zamanım da var enerjim de bir yazı da buraya yazayım dedim.. iyi demiş miyim ? :)
Elimizde Deneme2 adlı bir namespace mevcut olsun, hatta bu ayrı bir proje olsun; (hedef namespace)
[csharp]
namespace Deneme2
{
public class Aha
{
public Aha(int a)
{
Console.WriteLine(“Aha.Const = ” + a.ToString());
}
public void ToString(ref int sayi)
{
Console.WriteLine(“Aha.ToString” + sayi.ToString());
sayi = 10;
}
}
}
[/csharp]
Ve Deneme2 Assembly’sine erişerek “Aha” sınıfını ‘reflection’ ile yaratıp ref veya normal parametreler geçerek method’larını çağıran TestApp1 namespace’inde Program adlı bir sınıfımız olsun…
[csharp]
namespace TestApp1
{
class Program
{
static void Main(string[] args)
{
// Deneme2 ayrı bir proje olduğu için şu anki Assembly’de yer almaz bu nedenle
// çağrılmalıdır.
Assembly myAssembly = Assembly.Load(“Deneme2”);
// myAssembly içerisinden Aha adlı sınıfın tipi alınıyor.
Type myType = myAssembly.GetType(“Deneme2.Aha”, true, true);
// Yapıcı ve methodlar için parametre listesi düzeneği hazırlanıyor.
Type[] paramTypes = new Type[1];
paramTypes[0] = typeof(int);
// Yukarıda hazırlanan parametre listesinin değerleri hazırlanıyor.
Object[] paramValues = new Object[1];
paramValues[0] = (object)5;
// Daha Önceden tipi hazırlanmış olan sınıfın yapıcısını parametre
// listesi ve değerleri ile çağırıyoruz.
ConstructorInfo myInfo = myType.GetConstructor(paramTypes);
Object myAhaObject = myInfo.Invoke(paramValues);
// Yeni oluşturduğumuz myAhaObject üzerinde “ToString” method’u ‘invoke’ ediliyor.
myType.InvokeMember(“ToString”, BindingFlags.InvokeMethod, null, myAhaObject, paramValues);
Console.WriteLine((int)paramValues[0]);
Console.ReadLine();
}
}
}
[/csharp]
Kolay gelsin, tekrar gÖrüşmek üzere..!