Làm thế nào để vượt qua một lớp và một tên phương thức như dây và gọi phương thức của lớp đó?Cách tự động gọi phương thức của lớp trong .NET?
Giống như
void caller(string myclass, string mymethod){
// call myclass.mymethod();
}
Cảm ơn
Làm thế nào để vượt qua một lớp và một tên phương thức như dây và gọi phương thức của lớp đó?Cách tự động gọi phương thức của lớp trong .NET?
Giống như
void caller(string myclass, string mymethod){
// call myclass.mymethod();
}
Cảm ơn
Bạn sẽ muốn sử dụng reflection.
Dưới đây là một ví dụ đơn giản:
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");
}
}
Bây giờ đây là một rất ví dụ đơn giản, không có sự kiểm tra lỗi và cũng bỏ qua các vấn đề lớn hơn như phải làm gì nếu loại sống trong lắp ráp khác nhưng tôi nghĩ điều này sẽ giúp bạn đi đúng hướng.
Something như thế này:
public object InvokeByName(string typeName, string methodName)
{
Type callType = Type.GetType(typeName);
return callType.InvokeMember(methodName,
BindingFlags.InvokeMethod | BindingFlags.Public,
null, null, null);
}
Bạn nên sửa đổi những lá cờ ràng buộc theo phương thức mà bạn muốn gọi, cũng như kiểm tra các phương pháp Type.InvokeMember trong MSDN để chắc chắn về những gì bạn thực sự cần.
-1 Điều này không biên dịch. –
Bạn đúng, xin lỗi tôi. Đã chỉnh sửa để thêm đối số phương thức không thể bỏ qua (C# 4.0 trong đó nghệ thuật ngươi) :) –
Lý do của bạn để thực hiện việc này là gì? Nhiều hơn khả năng bạn có thể làm điều này mà không cần phản ánh, lên đến và bao gồm cả tải lắp ráp động.
Miễn là lắp ráp được tải và tên tệp là đủ điều kiện lắp ráp, bạn là vàng. –
Hmm ... Tôi ', tìm ví dụ của bạn để trả về null trong "Type.GetType (myclass);" – pistacchio
Đó là bởi vì assembly có chứa myclass chưa được nạp vào appdomain. Bạn sẽ phải lấy tên assembly từ người gọi và làm Assembly.LoadFrom hoặc một trong nhiều biến thể để nạp assembly trước. – Will