Sınıf ve yöntem adı dizeleri olarak nasıl iletilir ve bu yöntemin 'yöntemini çağırır?.NET'te bir sınıf yöntemini dinamik olarak nasıl çağırırız?
void caller(string myclass, string mymethod){
// call myclass.mymethod();
}
teşekkür
Sınıf ve yöntem adı dizeleri olarak nasıl iletilir ve bu yöntemin 'yöntemini çağırır?.NET'te bir sınıf yöntemini dinamik olarak nasıl çağırırız?
void caller(string myclass, string mymethod){
// call myclass.mymethod();
}
teşekkür
gibi
Sen reflection kullanmak isteyeceklerdir. Şimdi bu çok basit bir örnek, hata kontrolü yoksun ve tip başka montaj yaşıyor ama sanırım eğer da ne yapacağını gibi büyük sorunlarımız yok sayar
using System;
using System.Reflection;
class Program
{
static void Main()
{
caller("Foo", "Bar");
}
static void caller(String myclass, String mymethod)
{
// Get a type from the string
Type type = Type.GetType(myclass);
// Create an instance of that type
Object obj = Activator.CreateInstance(type);
// Retrieve the method you are looking for
MethodInfo methodInfo = type.GetMethod(mymethod);
// Invoke the method on the instance we created above
methodInfo.Invoke(obj, null);
}
}
class Foo
{
public void Bar()
{
Console.WriteLine("Bar");
}
}
: Burada
basit bir örnek Bu sizi doğru yola koymalı. Böyleşey:
public object InvokeByName(string typeName, string methodName)
{
Type callType = Type.GetType(typeName);
return callType.InvokeMember(methodName,
BindingFlags.InvokeMethod | BindingFlags.Public,
null, null, null);
}
Arayacağım yanı sıra gerçekten ne gerek belli olmaya msdn içinde Type.InvokeMember yöntemini kontrol etmek isteyen yöntemine göre bağlanma seçeneklerini değiştirmek gerekir.
-1 Bu derleme yapmıyor. –
Haklısınız, özür dilerim. Göz ardı edilemeyen yöntem argümanları eklemek için düzenlenmiştir (C# 4.0 nerede sanatınız var) –
Bunu yapmanın nedeni nedir? Dinamik montaj yüklemesi de dahil olmak üzere bunu yansıma olmadan yapabilirsiniz.
Derleme yüklendiği ve typename derleme kalifiye olduğu sürece, siz altınsınız. –
Hmm ... 'Type.GetType (myclass)' da null dönmek için örneğinizi bulmak; – pistacchio
Bunun nedeni, myclass içeren derlemenin henüz uygulama alanına yüklenmemiş olmasıdır. Montaj ismini arayandan almanız ve Assembly.LoadFrom'u veya montajı ilk önce yüklemek için birçok varyanttan birini yapmanız gerekir. – Will