15 Kasım 2017 Çarşamba

MethodInfo Sınıfı

Giriş
Şu satırı dahil ederiz.
using System.Reflection;
Constructor
Elimizde şöyle bir sınıf olsun.
public class Foo
{
  public void test()
  {
    ...
  }

}     
Şöyle yaparız.
MethodInfo methodInfo = typeof(Foo).GetMethod("test", 
  BindingFlags.Instance | BindingFlags.Public);
DeclaringType Alanı
Metodun hangi sınıf içinde olduğunu belirtir. Şöyle yaparız.
if (methodInfo.DeclaringType != typeof(Enumerable)){...}
Elimizde lambda'dan elde ettiğimiz bir MethodInfo olsun
int myLocalVariable = 9000;
Func<int, bool> lambda2 = i => i == myLocalVariable;
MethodInfo lambdaMethod = lambda2.Method;
Lambda'nın sınıfından bir tane yaratıp çağırmak için şöyle yaparız.
var instance = Activator.CreateInstance(lambdaMethod.DeclaringType);
result = lambdaMethod.Invoke(instance, new object[] { 9000 });

GetCustomAttributes metodu
Örnek ver

GetParameters metodu
Şöyle yaparız.
MethodInfo methodInfo = ...
var methodParams = methodInfo.GetParameters();
Invoke metodu - member için 
Parametreler object[] içinde geçilir. Date alan bir metodu çağırmak için şöyle yaparız.
var scheduleDate = new DateTime(2010, 03, 11);
MethodInfo methodInfo = ...;var o = ...;
methodInfo.Invoke(o, new object[] { scheduleDate });
Eğer üye bir metodu şöyle çağırırsak
MethodInfo methodInfo = ...;
var returnValue = (bool)methodInfo.Invoke(null, new object[] {...});
System.Reflection.TargetException exception fırlatılır. Hata açıklaması şöyledir.
Non-static method requires a target.
Invoke metodu - static 
Metod parametre almıyorsa şöyle yaparız
var returnValue = methodInfo.Invoke(null, new object[] { });
IsAssembly Alanı
Açıklaması şöyle
Gets a value indicating whether the potential visibility of this method or constructor is described by System.Reflection.MethodAttributes.Assembly; that is, the method or constructor is visible at most to other types in the same assembly, and is not visible to derived types outside the assembly.
Örnek
Şöyle yaparız.
if (methodInfo.IsAssembly) {...}
Örnek
Elimizde şöyle bir kod olsun. Bu kodda yerel metod (local function) var.
public class Foo {
  private static void FooMethod(){
    void LocalFoo(){
      ...
    }
    ...
  }
}
private static metodları almak için şöyle yaparız.
var methods = typeof(Foo).GetMethods(BindingFlags.Static|BindingFlags.NonPublic)
  .Select(m=>m.Name).ToList();
Elimizde şu metodlar geçer.
FooMethod
<FooMethod>g__LocalFoo5_0
IsAssembly ile local function'ı elemek için şöyle yaparız.
var methods = typeof(Foo).GetMethods(BindingFlags.Static | BindingFlags.NonPublic)
  .Where(x => !x.IsAssembly)
  .Select(x => x.Name)
  .ToList();
IsFamily Alanı
Şöyle yaparız.
if (methodInfo.IsFamily) {...}
IsPrivate Alanı
Şöyle yaparız.
if (methodInfo.IsPrivate) {...}
IsPublic Alanı
Şöyle yaparız.
if (methodInfo.IsPublic) {...}
MakeGenericMethod metodu
Elimizde generic iki tane metod olsun.
static class Extensions
{
  public static string Primary<T>(this T obj)
  {
    Debug.Log(obj.ToString());
    return "";
  }

  public static string List<T>(this List<T> obj)
  {
    Debug.Log(obj.ToString());
    return "";
  }
}
T parametresi olarak string vermek için şöyle yaparız.
//This works
var pmi = typeof(Extensions).GetMethod("Primary");
var pgenerci = pmi.MakeGenericMethod(typeof(string));
pgenerci.Invoke(null, new object[] {"string"  });
T parametresi olarak string vermek için şöyle yaparız.
var mi = typeof(Extensions).GetMethod("List");
var stringGeneric = mi.MakeGenericMethod(typeof(string));
stringGeneric.Invoke(null, new object[] {new List<string> { "list of string"} });
MethodHandle Alanı
Şöyle yaparız.
MethodInfo methodInfo = ...;
RuntimeHelpers.PrepareMethod(methodInfo.MethodHandle);
Name Alanı
Metodun ismini belirtir.
Örnek
Şöyle yaparız.
if (methodInfo.Name != "Contains"){...}
Örnek
Şöyle yaparız.
var methods = typeof(Foo).GetMethods(BindingFlags.Static|BindingFlags.NonPublic)
  .Where(m=>!m.Name.Contains("<")
  .Select(m=>m.Name).ToList();
ReturnType Alanı
Şöyle yaparız.
if (methodInfo.ReturnType != typeof(bool)) {...}

Hiç yorum yok:

Yorum Gönder