2010-11-12 41 views
9

Tôi cần kiểm tra sự bình đẳng giữa hai MethodInfos. Chúng thực sự là cùng một MethodInfo giống với ngoại lệ của ReflectedType (có nghĩa là, DeclaringType giống nhau và các phương thức thực sự nên có cùng một phần thân). Có một số cách để làm điều này, nhưng tôi đang tìm kiếm hiệu quả nhất.Phương thức EquInfo để khai báo Loại

Ngay bây giờ tôi có:

public static bool AreMethodsEqualForDeclaringType(this MethodInfo first, MethodInfo second) 
    { 
     first = first.ReflectedType == first.DeclaringType ? first : first.DeclaringType.GetMethod(first.Name, first.GetParameters().Select(p => p.ParameterType).ToArray()); 
     second = second.ReflectedType == second.DeclaringType ? second : second.DeclaringType.GetMethod(second.Name, second.GetParameters().Select(p => p.ParameterType).ToArray()); 
     return first == second; 
    } 

Đây là loại đắt tiền, vì vậy tôi tự hỏi nếu có một cách tốt hơn ...

Tôi có nên so sánh hai cơ quan phương pháp để thay thế? ví dụ.

first.GetMethodBody() == second.GetMethodBody() 

Cảm ơn.

+0

Tại sao không thể bạn chỉ cần so sánh các loại tuyên bố trực tiếp mà không so sánh hem cho các loại phản ánh? Tôi cũng thích biết tại sao bạn cần phải như vậy. – jgauffin

+1

Chắc chắn chỉ có thể so sánh các loại khai báo, nhưng nó đắt hơn vì yêu cầu gọi GetParameters(), trong khi, nếu các ReflectedTypes bằng nhau, tôi chỉ có thể thực hiện kiểm tra bình đẳng thông thường. – Jeff

+1

Tôi cần làm điều này vì tôi có các lớp Proxy được tạo bởi EntityFramework khi chạy mà tôi đang thực hiện một số phản ánh. – Jeff

Trả lời

3

tôi đoán tôi sẽ để lại câu trả lời của tôi là câu trả lời cho câu hỏi ...

Một điều cần lưu ý:

first.GetMethodBody() == second.GetMethodBody() 

KHÔNG làm việc ... do đó câu trả lời duy nhất mà tôi đã tìm thấy cho đến nay là:

public static bool AreMethodsEqualForDeclaringType(this MethodInfo first, MethodInfo second) 
{ 
    first = first.ReflectedType == first.DeclaringType ? first : first.DeclaringType.GetMethod(first.Name, first.GetParameters().Select(p => p.ParameterType).ToArray()); 
    second = second.ReflectedType == second.DeclaringType ? second : second.DeclaringType.GetMethod(second.Name, second.GetParameters().Select(p => p.ParameterType).ToArray()); 
    return first == second; 
} 
+0

thân phương thức có một byte [] là IL của thân phương thức, bạn có thể so sánh các byte đó theo byte thay vì chỉ sử dụng "==". –

+0

@Jeff. Tôi biết tôi đã trễ một thập kỷ cho bữa tiệc nhưng ... bạn vẫn đang sử dụng mã này thành công? Tôi cần một cái gì đó tương tự nhưng không tìm cách để phát minh ra một bánh xe. [Ayende có một bài viết về điều này] (http://ayende.com/blog/2658/method-equality) mà bạn chắc chắn phải đã nhìn thấy. Đánh giá cao bất kỳ phản hồi nào. Chúc mừng – Berryl

1

Would so sánh sự giúp đỡ MetadataTokenModule?

Tài liệu của MetadataToken mô tả nó là: "Một giá trị, kết hợp với Mô-đun, xác định duy nhất một phần tử siêu dữ liệu."

Cho đến giờ tôi thấy nó hoạt động để so sánh các cá thể MemberInfo thành viên ngoại trừ-cho-ReflectedType. Nhưng tôi đã không kiểm tra nó cho các trường hợp như định nghĩa phương pháp chung chung.

+0

Cảm ơn, nhưng đó là trường hợp cụ thể không hoạt động. – Jeff

0

mã này hoạt động khi bạn cố gắng đến lớp và giao diện phương pháp bình đẳng:

static bool EquelMethods(MethodInfo method1, MethodInfo method2) 
    { 
     var find = method1.DeclaringType.GetMethod(method2.Name, method2.GetParameters().Select(p => p.ParameterType).ToArray()); 
     return find != null; 
    } 
Các vấn đề liên quan