2013-02-10 14 views
5

Yapabileceğim bir değişkeni olan bir yöntem vermek istiyorum. Ancak, bu değişkeni farklı (yayımlanmamış) bir yönteme referans olan bir MethodInfo nesnesi içinde saklamak istiyorum.Önceden yüklenmiş bir MethodInfo yerel değişkeni ile nasıl bir yöntem yayabilirim?

Tür kodlarını typeof (someClass) .GetMethod (...) olarak adlandırmak için yayabiliyordum, ancak bu MethodInfo için bir token yükleyip doğrudan değişkenin içine atabilseydim daha verimli olurdu.

Yeniden ifade etmek gerekirse, yayma olasılığını bulmaya çalışıyorum, bir "yükleme nesnesi" opcode diyelim ve çalışma zamanında yığının üzerine yüklenecek olan emit zamanında bir nesneyi iletelim. (OpCodes.Ldobj bunu denediğimde bir çeşit hata verdi). Ya da, çalışma zamanında bunu yapacak opcodes yayınlamak zorunda mıyım?

+0

Bence bu mümkün. Eric Lippert bir zamanlar bunu kullanan C# operatörünün olası bir haberi hakkında blog hazırladı. – usr

+0

Sorunun neden benim için biraz daha açık hale getirilmesi için arkasındaki sebep hakkında biraz bilgi verebilir misiniz? –

+0

@usr [Bahsettiğiniz makale] (http://blogs.msdn.com/b/ericlippert/archive/2009/05/21/in-foof-we-trust-a-dialogue.aspx) is "Bilgi" nin sözdizimsel sorunları hakkında, nasıl uygulanabileceği değil. – svick

cevap

8

IL'de herhangi bir genel nesneyi yükleyemezsiniz, çünkü bu dosyayı IL'de saklamanın bir yolu yoktur (string gibi bazı özel türler hariç). Serileştirmeyi kullanarak bunu destekleyebilirsin (bunu destekleyen türler için), ama istediğin şeyin bu olduğunu düşünmüyorum. Ayrıca, ldobj oldukça farklı bir amaca hizmet ediyor.

Ancak bunu MethodInfo için typeof işleci için C# 'ye çok benzer bir şekilde yapabilirsiniz. Bunun anlamı şudur:

  1. MethodInfo döndüren bir yöntem oluşturmak için RuntimeMethodHandle
  2. MethodBase.GetMethodFromHandle() çağıran bir MethodInfo

bütün kod bir MethodBase

  • döküm onu ​​almak için almak için ldtoken talimatı kullanarak şöyle olabilir:

    MethodInfo loadedMethod = …; 
    var getMethodMethod = typeof(MethodBase).GetMethod(
        "GetMethodFromHandle", new[] { typeof(RuntimeMethodHandle) }); 
    
    var createdMethod = new DynamicMethod(
        "GetMethodInfo", typeof(MethodInfo), Type.EmptyTypes); 
    
    var il = createdMethod.GetILGenerator(); 
    il.Emit(OpCodes.Ldtoken, loadedMethod); 
    il.Emit(OpCodes.Call, getMethodMethod); 
    il.Emit(OpCodes.Castclass, typeof(MethodInfo)); 
    il.Emit(OpCodes.Ret); 
    
    var func = (Func<MethodInfo>)createdMethod.CreateDelegate(typeof(Func<MethodInfo>)); 
    Console.WriteLine(func()); 
    
  • +0

    Mükemmel bir şekilde çalıştı! –

    İlgili konular