2011-02-02 38 views
7

Có thể tạo ra các thành viên bình đẳng cho một lớp, trong đó cũng sẽ bao gồm các thành viên từ lớp cơ sở của nó?Resharper - tạo thành viên bình đẳng bao gồm các thành viên lớp cơ sở

Ví dụ - trừu tượng lớp cơ sở:

public abstract class MyBaseClass 
{ 
    public int Property1; 
} 

lớp khác:

public class MyOtherClass: MyBaseClass 
{ 
    public int Property2 {get; set;} 
} 

Nếu tôi autogenerate thành viên bình đẳng với Resharper, tôi nhận được bình đẳng chỉ dựa trên MyOtherClass.Property2 tài sản và không còn trên Property1 từ lớp cơ sở của nó.

Trả lời

10

Đầu tiên tạo kiểm tra bình đẳng trong lớp cơ sở, sau đó thực hiện nó trong hậu duệ.

Trong hậu duệ, sự khác biệt sẽ ở trong lớp public bool Equals(MyOtherClass other).

Nếu không kiểm tra bình đẳng trong lớp cơ sở:

public bool Equals(MyOtherClass other) 
{ 
    if (ReferenceEquals(null, other)) 
     return false; 
    if (ReferenceEquals(this, other)) 
     return true; 
    return other.Property2 == Property2; 
} 

Với bình đẳng-kiểm tra trong lớp cơ sở:

public bool Equals(MyOtherClass other) 
{ 
    if (ReferenceEquals(null, other)) 
     return false; 
    if (ReferenceEquals(this, other)) 
     return true; 
    return base.Equals(other) && other.Property2 == Property2; 
} 

Thông báo cuộc gọi bổ sung vào base.Equals(other), mà do đó trở thành chịu trách nhiệm về bất động sản tại lớp cơ sở.

Lưu ý nếu bạn thực hiện theo cách khác, trước tiên bạn thêm kiểm tra bình đẳng vào hậu duệ, sau đó thêm chúng vào lớp cơ sở, sau đó ReSharper không đi và sửa đổi mã trong hậu duệ, bạn phải tạo lại nó (xóa + tạo) hoặc sửa đổi mã bằng tay.

+3

để tạo lại, bạn không cần phải xóa. Khi bạn tạo, có một tùy chọn để thay thế các thành viên hiện có. –

+0

Aha! Cảm ơn thông tin đó. –

+0

Infact, đây là những gì được tạo trong Resharper hôm nay (trong phiên bản được bảo vệ của phương thức Equals) – Ergodyne

Các vấn đề liên quan