2009-04-25 17 views
7

Genel tip parametrelere sahip bir DynamicMethod tanımlamak mümkün mü? MethodBuilder sınıfı, DefineGenericParameters yöntemine sahiptir. DynamicMethod'un bir karşılığı var mı? Örneğin, DynamicMethod kullanarak verilen bir darbe gibi bir imzayla bir yöntem oluşturmak mümkün mü? Eğer DynamicMethod hiçbir DefineGenericParameters yöntemi vardır gördüğümüz gibi, ve sadece NotSupportedException atar onun MethodInfo taban sınıfından MakeGenericMethod devralır:Genel tip parametrelere sahip DynamicMethod

void T Foo<T>(T a1, int a2) 
+1

dinamik olarak yöntemini oluşturmak zaman türlerini bilemeyiz sonra yöntemini oluşturuyorsanız? Genel bir dinamik yönteme sahip olma ihtiyacını ortadan kaldıran nedir? – Steven

+0

Küçük bir tercüman yazıyorum ve fonksiyonları derlemek için DynamicMethods kullanmak istiyorum. Dilin parametrik polimorfizm için desteği vardır ve tip parametrelerinin kullanılması güzel olurdu ve her bir parametre kombinasyonu için aşırı yüklenme yaratması gerekmiyordu. – Alex

+1

Bkz. Https://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2508820-dynamicmethod-to-support-generic-type-parameters-l destek eklemeye oy vermek için. – cdiggins

cevap

2

Aslında orada tip argümanlar her set için bir kez aynı DynamicMethod üreterek AppDomain.DefineDynamicAssembly

  • Jenerik kendin yap kullanarak bütün bir dinamik montaj tanımla bir yol, tam olarak jenerik değil ama şu fikirden yararlanacaksınız:

    public delegate T Foo<T>(T a1, int a2); 
    
    public class Dynamic<T> 
    { 
        public static readonly Foo<T> Foo = GenerateFoo<T>(); 
    
        private static Foo<V> GenerateFoo<V>() 
        { 
         Type[] args = { typeof(V), typeof(int)}; 
    
         DynamicMethod method = 
          new DynamicMethod("FooDynamic", typeof(V), args); 
    
         // emit it 
    
         return (Foo<V>)method.CreateDelegate(typeof(Foo<V>)); 
        } 
    } 
    

    Böyle diyebilirsin:

    Dynamic<double>.Foo(1.0, 3); 
    
  • +0

    Aslında, bu hiç de kötü bir fikir değil :). Yine bu konuyla karşılaşırsam akılda kalacağım. Cevabı bir cevap olarak seçiyorum çünkü orijinal problemi çözüme yaklaştığında. Teşekkürler. – Alex

    7

    Bu mümkün görünmemektedir.

    olasılıklar bir çift:

    • ,
    +0

    Teşekkürler. Korktuğum şey buydu. Sanırım başka yolu yok. DynamicMethods ile bunun için destek olması güzel olurdu. – Alex

    İlgili konular