18 Eylül 2017 Pazartesi

Reflection ile Generic Tipi Bulmak

Örnek
Bazen generic olduğunu bildiğimiz bir parametrenin List, HashSet veya ne olduğunu bilmek isteriz. Her zamanki gibi önce Type nesnesini buluruz.
Type type = someObject.GetType();
Daha sonra generic olup olmadığını kontrol ederiz.
if (currentType.IsGenericType)
{...}
Eğer istersek IEnumerable arayüzünü gerçekleştirip gerçekleştirmediğine de bakabiliriz. Nihai amacımızı ise GetGenericTypeDefinition() metodunu kullanarak nesnenin tipini bulmaktır.
if (type is IEnumerable)
{
    var listGenericType = type.GetType().GetGenericTypeDefinition();

    if (listGenericType == typeof(List<>)) {
        //do something
    }
    else if (listGenericType == typeof(HashShet<>)) {
        //do something
    }
 } 
Örnek
Bazen Generic kod içinde T parametresini bulmak isteriz. typeof() kullanarak şöyle yaparız.
public class BaseClass { }
public class DerivedClass: BaseClass { }

public class GenericClass<T> where T : BaseClass
{
  public string TypeOf = typeof(T).ToString();
}

public class GenericSuperClass<T> where T : BaseClass
{
  public GenericClass<T> Sub = new GenericClass<T>();
}

static void Main(string[] args)
{
  Console.WriteLine("1 - " + (new GenericClass<BaseClass>()).TypeOf);
  Console.WriteLine("2 - " + (new GenericClass<DerivedClass>()).TypeOf);

  Console.WriteLine("3 - " + (new GenericSuperClass<BaseClass>()).Sub.TypeOf);
  Console.WriteLine("4 - " + (new GenericSuperClass<DerivedClass>()).Sub.TypeOf);
  Console.ReadLine();
}
Çıktı olarak şunu alırız
1 - BaseClass
2 - DerivedClass    
3 - BaseClass
4 - DerivedClass


Hiç yorum yok:

Yorum Gönder