Tương tự cho các phương pháp quá:Làm cách nào để so sánh hai PropertyInfos hoặc các phương thức đáng tin cậy?
tôi đưa ra hai trường hợp của PropertyInfo hoặc các phương pháp đã được chiết xuất từ lớp họ ngồi trên qua GetProperty()
hoặc GetMember()
vv, (hoặc từ một MemberExpression có thể).
Tôi muốn để xác định xem họ đang có trong thực tế đề cập đến các tài sản tương tự hoặc phương pháp tương tự như vậy
(propertyOne == propertyTwo)
hoặc
(methodOne == methodTwo)
Rõ ràng rằng sẽ không thực sự làm việc, có lẽ bạn đang xem xét cùng một thuộc tính, nhưng nó có thể đã được trích xuất từ các cấp khác nhau của hệ thống phân cấp lớp (trong trường hợp này thường là, propertyOne != propertyTwo
)
Của cours e, tôi có thể nhìn vào DeclaringType, và tái yêu cầu tài sản, nhưng điều này bắt đầu nhận được một chút bối rối khi bạn bắt đầu nghĩ về
- Thuộc tính/Phương pháp tuyên bố trên giao diện và thực hiện trên lớp
- Thuộc tính/phương pháp kê khai trên một lớp cơ sở (hầu như) và ghi đè vào các lớp thừa kế
- Thuộc tính/Phương pháp tuyên bố trên một lớp cơ sở, ghi đè với 'mới' (trong IL thế giới này là gì iirc đặc biệt)
vào cuối của ngày, tôi chỉ muốn có thể làm một eq thông minh kiểm tra tình trạng giữa hai thuộc tính hoặc hai phương pháp, tôi chắc chắn rằng 80% điểm đạn trên không bao gồm tất cả các trường hợp cạnh, và trong khi tôi có thể ngồi xuống, viết một loạt các bài kiểm tra và bắt đầu chơi, tôi ' Tôi biết rằng kiến thức cấp thấp của tôi về cách các khái niệm này thực sự được triển khai không phải là tuyệt vời và tôi hy vọng đây là chủ đề đã được trả lời và tôi chỉ tìm kiếm.
Câu trả lời tốt nhất là cho tôi một vài phương pháp mà đạt được nêu trên, giải thích những gì trường hợp cạnh đã được đưa về chăm sóc và tại sao :-)
Làm rõ:
Theo nghĩa đen, Tôi muốn đảm bảo chúng là cùng một thuộc tính, dưới đây là một số ví dụ:
public interface IFoo
{
string Bar { get; set; }
}
public class Foo : IFoo
{
string Bar { get; set; }
}
typeof(IFoo).GetProperty("Bar")
và
typeof(Foo).GetProperty("Bar")
Sẽ trở lại hai infos tài sản, mà không bằng nhau:
public class BaseClass
{
public string SomeProperty { get; set ; }
}
public class DerivedClass : BaseClass { }
typeof(BaseClass).GetMethod("SomeProperty")
và
typeof(DerivedClass).GetProperty("SomeProperty")
tôi có thể không thực sự nhớ nếu hai trở lại đối tượng bằng nhau bây giờ, nhưng trong thế giới của tôi Họ đều bình đẳng.
Tương tự:
public class BaseClass
{
public virtual SomeMethod() { }
}
public class DerivedClass
{
public override SomeMethod() { }
}
typeof(BaseClass).GetMethod("SomeMethod")
và
typeof(DerivedClass).GetProperty("SomeMethod")
Một lần nữa, chúng sẽ không phù hợp - nhưng tôi muốn họ (Tôi biết họ không đặc biệt như nhau, nhưng trong phạm vi của tôi họ là vì chúng đề cập đến cùng một thuộc tính gốc)
Tôi có thể làm điều đó một cách có cấu trúc, nhưng điều đó sẽ là 'sai'.
Ghi chú Hơn nữa:
Làm thế nào để bạn thậm chí yêu cầu các tài sản đó là che giấu tài sản khác? Dường như một trong các giả định trước đó của tôi không hợp lệ, việc thực thi mặc định là GetProperty("name")
sẽ chuyển sang cấp hiện tại theo mặc định.
BindingFlags.DeclaringType
xuất hiện chỉ để kết thúc trả về giá trị rỗng!
"Thuộc tính/phương pháp được khai báo trên lớp cơ sở, ghi đè bằng 'mới'" - Điều đó thực sự được gọi là * ẩn * và chúng * chắc chắn * các thành viên khác nhau. Nó không có ý nghĩa để xem chúng là "bình đẳng" ở tất cả. – Ani
Vâng rõ ràng, tôi chỉ phrased rằng xấu - nó sẽ rất khó để viết mã so sánh để trở lại đúng trong trường hợp đó ;-) - nó vẫn là một con đường không hạnh phúc cần thử nghiệm, như tôi có thể nghĩ về mã so sánh cấu trúc . –
Bạn có thể làm rõ câu hỏi tốt hơn không? Bạn có muốn 'string.GetHashCode == int.GetHashCode' (vì các định nghĩa cơ sở của chúng có cùng kiểu -' đối tượng') không. Làm thế nào về 'Danh sách .Count' so với' HashSet .Count' (cả hai thực hiện 'ICollection .Count')? –
Ani