2010-01-15 29 views
15

Tôi có một lớp cơ sở, với một phương pháp, nơi tôi muốn sử dụng Generics để buộc các coder để sử dụng một biểu thức tổng quát trên lớp hiện tại:Làm thế nào để tham khảo kiểu lớp hiện tại sử dụng Generics

public class TestClass 
{ 
    public void DoStuffWithFuncRef<T>(Expression<Func<T, object>> expression) where T : TestClass 
     { 
      this.DoStuffWithFuncRef(Property<T>.NameFor(expression)); 
     } 
} 

Bây giờ , Tôi muốn buộc T là loại của lớp instantiated, mà tôi hy vọng sẽ gây ra trình biên dịch C# để tự động hiểu loại chung để sử dụng. Ví dụ. Tôi muốn tránh mã hóa các phương pháp doStuff dưới đây, nơi tôi phải xác định đúng loại - nhưng thay vì sử dụng phương pháp doStuffILikeButCannotGetToWork:

public class SubTestClass : TestClass 
{ 
    public string AProperty { get; set; } 

    public void doStuff() 
    { 
     this.DoStuffWithFuncRef<SubTestClass>(e => e.AProperty); 
    } 

    public void doStuffILikeButCannotGetToWork() 
    { 
     this.DoStuffWithFuncRef(e => e.AProperty); 
    } 
} 

Đây có phải là có thể? Tôi có nên làm điều này theo một cách khác không?

Trả lời

19

Tận dụng lớp cơ sở tự chung:

public class TestClass<T> where T : TestClass<T> 
{ 
    public void DoStuffWithFuncRef(Expression<Func<T, object>> expression) 
    { 
     this.DoStuffWithFuncRef(Property<T>.NameFor(expression)); 
    } 
} 

và lấy được từ nó:

public class SubTestClass : TestClass<SubTestClass> { 
    // ... 
} 

Nếu bạn cần phải có một hệ thống phân cấp thừa kế với một gốc duy nhất, kế thừa các lớp cơ sở chung từ khác phiên bản không phải là chung:

public class TestClass { ... } 
public class TestClass<T> : TestClass where T : TestClass<T> 

Tất nhiên bạn có lẽ nên tạo các lớp cơ sở trừu tượng.

+0

Cảm ơn bạn. Tôi đã không nghĩ đến việc tạo ra một lớp chung hoàn chỉnh theo cách mà bạn descibe, nhưng nó hoạt động và gây ra ít cú pháp trên đầu. – Thies

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