Giriş
Bu sınıf Type ve TypeInfo olarak ikiye ayrıldı. Evolving the Reflection API yazısında açıklaması okunabilir.
Bu sınıf reflection için çokça kullanılır. Açıklaması şöyle
BaseType Alanı
Açıklaması şöyle
Örnek
Şöyle yaparız.
Şöyle yaparız.
Şöyle yaparız.
Şöyle yaparız.
Sınıfın tanımladığı veya kalıtımla gelen System.Attribute tipinden veriyi verir. Şöyle yaparız.
Kalıtım ile gelen property'leri elemek için şöyle yaparız.
Örnek
Elimizde bir liste olsun.
Elimizde bir kalıtım hiyerarşisi olsun
Tipin belli bir generic arayüzü gerçekleştirip gerçekleştirmediğini anlamak için şöyle yaparız.
Ata arayüzleri dolaşarak belli bir generic sınıftan kalıtım olduğunu bulmak için şöyle yaparız.
GetInterfaces metodu
Bir Assembly içindeki IRead<> arayüzünü gerçekleştiren tipleri bulmak için şöyle yaparız.
Enum'larda ismi belirtilen enum hakkında bilgi döner.
GetMembers metodu
Şöyle yaparız.
Şöyle yaparız. Eğer metod overload edilmiş ise System.Reflection.AmbiguousMatchException fırlatılır.
Metod imzasındaki parametre tipleri kullanılır. Şöyle yaparız.
Nesneye ait public olan, kalıtımla gelmeyen metodları şöyle alırız.
Bir sınıfın tanımladığı ve kalıtımla devraldığı tüm public property'leri döndürür.
Örnek
Bir dizi döndüğü için dizinin metodlarını kullanarak şöyle yaparız.
Dizi Linq ile de kullanılabilir. Şöyle yaparız.
Örnek
Elimizde kalıtım olsun.
Aynı şeyi şöyle de yapabiliriz.
Activator Sınıfı yardımı ile bir COM nesnesi yaratır. Şöyle yaparız.
Açıklaması şöyle.
Bir tipin List<T> olup olmadığını şöyle kontrol ederiz.
Şöyle yaparız.
Şöyle yaparız.
Şöyle yaparız.
Örnek ver.
IsValueType Alanı
Şöyle yaparız.
Örnek
Şöyle yaparız.
Eğer sınıf generic ise kaç tane generic parametre aldığı isme ekenir. Şöyle yaparız.
Örnek
Şöyle yaparız.
Elimizde bir hiyerarşi olsun.
Generics'ten System.Type sınıfına dönmek için typeof () kullanılır. Elimizde key alanı System.Type olan bir Dictionary olsun.
Bu sınıf Type ve TypeInfo olarak ikiye ayrıldı. Evolving the Reflection API yazısında açıklaması okunabilir.
Bu sınıf reflection için çokça kullanılır. Açıklaması şöyle
Bu sınıfı elde etmenin yolu typeof() çağrısı yapmak. Şöyle yaparız.Reflection provides objects (of type Type) that describe assemblies, modules and types. You can use reflection to dynamically create an instance of a type, bind the type to an existing object, or get the type from an existing object
typeof(Foo)
BaseType Alanı
Açıklaması şöyle
If your class is not inheriting or is only implementing interface(s) then it would return Object, otherwise your Parent Class Type.Ata sınıfı verir.
Örnek
Şöyle yaparız.
Type type = ...;
Type parentType = type.BaseType.
ÖrnekŞöyle yaparız.
public void doStuff<T>() where T : class
{
Type foo = typeof(T).BaseType;
}
FullName AlanıŞöyle yaparız.
void WriteFullName(Type t)
{
Console.WriteLine(t.FullName);
}
GetConstructor metoduŞöyle yaparız.
var constructor = typeof(T).GetConstructor(null);
GetCustomAttributes metoduSınıfın tanımladığı veya kalıtımla gelen System.Attribute tipinden veriyi verir. Şöyle yaparız.
[AttributeUsage(Inherited=true)]
public class FooAttribute : System.Attribute
{
private string name;
public FooAttribute(string name)
{
this.name = name;
}
public override string ToString() { return this.name; }
}
[Foo("hello")]
public class BaseClass {}
public class SubClass : BaseClass {}
// outputs "hello"
Console.WriteLine(typeof(SubClass).GetCustomAttributes().First());
GetDeclaringType AlanıKalıtım ile gelen property'leri elemek için şöyle yaparız.
var childPropertiesOnly = typeof(Child)
.GetProperties()
.Where(x => x.DeclaringType != typeof(Father))
.ToList();
GetGenericArguments metoduÖrnek
Elimizde bir liste olsun.
var listItem = new List<string> { "alex", "aa" };
Listenin generic tipini - ki örnekte string'dir - bulmak için şöyle yaparız.var typeOfGeneric = listItem.GetType().GetGenericArguments().First<Type>();
ÖrnekElimizde bir kalıtım hiyerarşisi olsun
public class Foo<T>
{
...
}
public class Bar<T, F> : Foo<T>
{
...
}
Şöyle yaparız.var list = new List<Foo<string>>();
list.Add(new Bar<string, int>() {...});
foreach (var x in list)
{
Type[] types = x.GetType().GetGenericArguments();
// Dirty check to confirm this is an Bar not a Foo
if (types.Length == 2)
{
...
}
}
GetGenericTypeDefinition metoduTipin belli bir generic arayüzü gerçekleştirip gerçekleştirmediğini anlamak için şöyle yaparız.
Type type = ...;
if(
type.IsGenericType &&
type.GetGenericTypeDefinition() == typeof(IChild<>)
)
Şöyle de yapılabilir.type.GetGenericTypeDefinition().IsAssignableFrom(typeof(IChild<>)));
Ata sınıfları dolaşarak belli bir generic sınıftan kalıtım olduğunu bulmak için şöyle yaparız.Ata arayüzleri dolaşarak belli bir generic sınıftan kalıtım olduğunu bulmak için şöyle yaparız.
GetInterfaces metodu
Bir Assembly içindeki IRead<> arayüzünü gerçekleştiren tipleri bulmak için şöyle yaparız.
var types = GetType().Assembly.GetTypes()
.Select(t => new
{
Type = t,
MatchingInterfaces = t.GetInterfaces()
.Where(i => i.GetGenericTypeDefinition() == typeof(IRead<>))
})
.Where(t => t.MatchingInterfaces.Any())
GetMember metoduEnum'larda ismi belirtilen enum hakkında bilgi döner.
Şöyle yaparız.
var members = typeof(class1).GetMembers(BindingFlags.Static | BindingFlags.Public);
GetMethod metoduŞöyle yaparız. Eğer metod overload edilmiş ise System.Reflection.AmbiguousMatchException fırlatılır.
Type t = ...;
MethodInfo methodInfo = t.GetMethod("Start");
GetMethod metodu - Type DizisiMetod imzasındaki parametre tipleri kullanılır. Şöyle yaparız.
Type t = ...;
MethodInfo methodInfo = t.GetMethod("Start", new Type[] {typeof(DateTime)} );
GetMethods metoduNesneye ait public olan, kalıtımla gelmeyen metodları şöyle alırız.
var type = typeof (Foo);
MethodInfo[] methods = type
.GetMethods(BindingFlags.Instance |
BindingFlags.Public |
BindingFlags.DeclaredOnly)
.ToList();
Nesneye ait public ve olmayan tüm metodları şöyle alırız.var type = typeof (Foo);
MethodInfo[] methods = type
.GetMethods(BindingFlags.Instance |
BindingFlags.Public |
BindingFlags.NonPublic)
.ToList();
GetProperty metodu
Sınıflarda ismi belirtilen property hakkında bilgi döner. Şöyle yaparız. Sonuç null dönebilir.string field = ...;
Type t = ...;
PropertyInfo propertyInfo = t.GetProperty(field);
GetProperties metoduBir sınıfın tanımladığı ve kalıtımla devraldığı tüm public property'leri döndürür.
Örnek
Bir dizi döndüğü için dizinin metodlarını kullanarak şöyle yaparız.
Type type = ...;
int Count = type.GetProperties().Count();
ÖrnekDizi Linq ile de kullanılabilir. Şöyle yaparız.
bool isNull = type.GetProperties()
.All(p => p.GetValue(objRequirement) != null);
GetProperties metodu - BindingFlagsÖrnek
Elimizde kalıtım olsun.
public class BaseClass
{
public string BaseProperty{get;set;}
}
public class ChildClass: BaseClass
{
public string ChildProperty{get;set;}
}
Sadece ChildClass'ın tanımladığı property'lere erişmek için şöyle yaparız.PropertyInfo[] infos = typeof(ChildClass).GetProperties(
BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly);
Açıklaması şöyleDeclaredOnly: Specifies that only members declared at the level of the supplied type's hierarchy should be considered. Inherited members are not considered.
foreach (PropertyInfo info in typeof(T).GetProperties()
.Where(x=>x.DeclaringType == typeof(T))) // filtering by declaring type
{
propertyNames.Add(info.Name);
}
Örnek
Şöyle yaparız.PropertyInfo[] p = typeof(myclass).GetProperties(BindingFlags.Public |
BindingFlags.Instance);
GetTypeIDFromProgID metoduActivator Sınıfı yardımı ile bir COM nesnesi yaratır. Şöyle yaparız.
var t = Type.GetTypeFromProgID("Application",null);
var app1 = Activator.GetInstance(t);
Şöyle yaparız.System.Type type = Type.GetTypeFromProgID("VisualStudio.DTE.14.0");
EnvDTE.DTE dte = (EnvDTE.DTE)System.Activator.CreateInstance(type);
IsAssignableFrom metoduAçıklaması şöyle.
ÖrnekType.IsAssignableFrom (Type c) Returns true if any of the following conditions is true:
- c and the current instance represent the same type.
c is derived either directly or indirectly from the current instance. c is derived directly from the current instance if it inherits from the current instance; c is derived indirectly from the current instance if it inherits from a succession of one or more classes that inherit from the current instance. The current instance is an interface that c implements. c is a generic type parameter, and the current instance represents one of the constraints of c.and false if none of these conditions are true, or if c is null.
Bir tipin List<T> olup olmadığını şöyle kontrol ederiz.
if (property.PropertyType.IsGenericType &&
typeof(List<>).IsAssignableFrom(property.PropertyType.GetGenericTypeDefinition()))
{...}
ÖrnekŞöyle yaparız.
var type1 = typeof(List<object>);
var type2 = typeof(IEnumerable<object>);
//returns true
type2.IsAssignableFrom(type1);
IsGenericType AlanıŞöyle yaparız.
if (property.PropertyType.IsGenericType) {...}
IsPrimitive AlanıŞöyle yaparız.
Type type = ...;
if ( (type.IsPrimitive) {...}
IsSubclassOf metoduÖrnek ver.
IsValueType Alanı
Şöyle yaparız.
Type type = ...;
if ( type.IsValueType) {...}
MakeArrayType metodu
Açıklaması şöyle
Verilen sınıfın ismini dönerAçıklaması şöyle
SBir vector yaratmak için şöyle yaparız.The common language runtime makes a distinction between vectors (that is, one-dimensional arrays that are always zero-based) and multidimensional arrays. A vector, which always has only one dimension, is not the same as a multidimensional array that happens to have only one dimension. You cannot use this method overload to create a vector type; if rank is 1, this method overload returns a multidimensional array type that happens to have one dimension. Use the MakeArrayType() method overload to create vector types.
var type = typeof(object).MakeArrayType(1);
// Create an instance with length 2
var array = Activator.CreateInstance(type, 2);
Console.WriteLine(array.GetType()); // System.Object[]
Console.WriteLine(type); // System.Object[*]
Name AlanıÖrnek
Şöyle yaparız.
Type type = typeof(string);
type.Name //Yine string alırız
ÖrnekEğer sınıf generic ise kaç tane generic parametre aldığı isme ekenir. Şöyle yaparız.
// Dictionary`2 - two generic parameters
Console.WriteLine(typeof(Dictionary<int, string>).Name);
// List`1 - one generic parameter
Console.WriteLine(typeof(List<int>).Name);
Generic parametre almayan sınıflarda şu çıktıyı alırız.// IDictionary`2 - two generic parameters
Console.WriteLine(typeof(IDictionary<int, string>).Name);
// IDictionary - no generic parameters
Console.WriteLine(typeof(System.Collections.IDictionary).Name);
ToString metoduÖrnek
Şöyle yaparız.
byte b = ...;
Console.WriteLine(B.GetType()); // Outputs "Byte"
ÖrnekElimizde bir hiyerarşi olsun.
class Plant{}
class Flower:Plant{}
Şöyle yaparız.Flower Rose = new Flower();
Plant RoseBush = (Plant)Rose;
Console.WriteLine(RoseBush.GetType()); //Outputs Flower
Plant Rose = new Flower();
Plant RoseBush = (Plant)Rose;
Console.WriteLine(RoseBush.GetType()); //Outputs Flower as well
DiğerGenerics'ten System.Type sınıfına dönmek için typeof () kullanılır. Elimizde key alanı System.Type olan bir Dictionary olsun.
public class DelegateDictionary
{
Dictionary<Type, Delegate> dic;
public DelegateDictionary()
{
dic = new Dictionary<System.Type, Delegate>();
}
public void Add<T>(Func<T, string, string, XmlElement> mtd)
{
dic.Add(typeof(T), mtd);
}
public XmlElement Invoke<T>(T value, string name, string namespaceURI)
{
if (!Lookup.TryGetValue(typeof(T), out var del))
throw new InvalidOperationException($"No delegate registered for {typeof(T).Name}");
var typedDel = (Func<T, string, string, XmlElement>)del;
return typedDel(value, name, namespaceURI);
}
}
Kullanmak için şöyle yaparız.// example usage
{
var dict = new DelegateDictionary();
dict.Add<string>(ElementCreators.CreateElementForString);
dict.Add<Decimal>(ElementCreators.CreateElementForDecimal);
dict.Invoke("stringValue", "myName", "what-even-is-a-namespace");
dict.Invoke(1.0m, "myName", "what-even-is-a-namespace");
}
Hiç yorum yok:
Yorum Gönder