2012-04-02 14 views
9

Yansıma yoluyla bir yöntemi çağırmak için Type.InvokeMember kullanabilir ve örnek olarak param dizi parametreleriyle ilgili oldukça sağlam görünüyor. Bazı nedenlerden dolayı isteğe bağlı parametrelerle uğraşmaz.Yansıma yoluyla isteğe bağlı params yöntemini kullanarak bir yöntem çağırın

İsteğe bağlı parametreleri dikkate alan bir yöntemi (belki DLR'yi kullanarak) çağırmak için daha iyi bir yaklaşım var mı?

+0

MethodInfo örneği almak için type.GetMethod (...) yöntemini çağırabilirsiniz. Ardından, isteğe bağlı parametreler için methodInfo.Invoke() yöntemini çağırabilirsiniz, Type.Missing'i iletebilirsiniz. –

+0

Ancak, bu, yöntemin tüm olası örnekleri üzerinde yineleme ve parametrelerim isteğe bağlı olarak verilip verilmediğini belirleme çabasına gitmemi gerektirir. parametreleri. Temelde, şu anda yaptığım şey olan el ile bağlama yapıyor. Sadece Type.InvokeMember yolun% 90 gider ve sonra başarısız olur. Çoğalmaya baktığımda şu an için manuel olarak yapıyorum. –

cevap

5

Aşağıdaki örnekte, hiçbir şey döndürmeyen iki parametreli bir işlevi çağırıyoruz. İkinci parametre isteğe bağlıdır.

MethodInfo mi = default(MethodInfo); 

// Loading the assembly 
Assembly reflectionAssemby = Assembly.LoadFile(@"C:\RelectionDLL.dll"); 

// Get type of class from loaded assembly 
Type reflectionClassType = reflectionAssemby.GetType("ReflectionDLL.ReflectionClass"); 

// Create instance of the class 
object objReflection = Activator.CreateInstance(reflectionClassType); 

mi = reflectionClassType.GetMethod("pub_Inst_NoReturn_Function"); 
mi.Invoke(objReflection, new object[] { value1, Type.Missing }); 
+1

Yanıt için teşekkürler. Bununla ilgili problem, Type.Missing'i iletebilmem için isteğe bağlı parametrenin bulunduğunu belirlemek için hala meta verilere girmem gerekiyor olmasıdır. Temelde C# derleyicisinin bağlama özelliklerini çalışma zamanında çoğaltan bir çözüm olmasını umuyordum. –

+0

@JamesGaunt Eski gönderi, ancak sonunda bunun bir yolunu buldunuz mu? –

+0

Wow evet çok eski ... Bir yol buldum ... ama C# derlemek için Roslyn derleyicisini kullanarak çalışma zamanında gerekli bağımlılıkları doğrudan. Yani aynı problemi çözmemek. Ancak, yeni derleyici özelliklerini bazı örnek kodları derlemek için kullanmanın yolları vardır ve sonra AST'yi nasıl bağlandığını görmek için denetleyin. –

İlgili konular