2012-02-05 24 views
10
public class BusinessObjects<O> 
    where O : BusinessObject 
{ 
    void SomeMethod() 
    { 
     var s = O.MyStaticMethod(); // <- How to do this? 
    } 
} 

public class BusinessObject 
{ 
    public static string MyStaticMethod() 
    { 
     return "blah"; 
    } 
} 

Có cách tiếp cận hướng đối tượng chính xác nào để hoàn thành điều này hay tôi cần phải sử dụng để phản ánh?Cách truy cập các phương pháp tĩnh của các loại chung

EDIT: Tôi đã đi quá xa trong việc cố gắng đơn giản hóa điều này cho câu hỏi và để lại một điểm quan trọng. MyStaticMethod sử dụng sự phản chiếu và cần loại có nguồn gốc để trả lại kết quả chính xác. Tuy nhiên, tôi chỉ nhận ra một lỗ hổng khác trong thiết kế của tôi là tôi không thể có một phương pháp ảo tĩnh và tôi nghĩ đó là những gì tôi cần.

Có vẻ như tôi cần phải tìm cách tiếp cận khác cho vấn đề này hoàn toàn.

+0

Nhìn vào đây để biết thêm thông tin: http://stackoverflow.com/q/196661/114029 –

+0

Tôi nghĩ đây là một câu hỏi khá hay. Nó không thể được thực hiện trong C# hiện tại. Nhưng điều này sẽ hữu ích cho Microsoft để thêm vào .Net 5+ – MarzSocks

Trả lời

2

Lý do bạn không thể tham khảo các thành viên tĩnh như thế này:

O.MyStaticMethod(); 

Is bởi vì bạn không biết loại O là gì. Có, nó kế thừa từ BusinessObject, nhưng các thành viên tĩnh không được kế thừa giữa các kiểu, vì vậy bạn chỉ có thể tham chiếu MyStaticMethod từ BusinessObject.

+0

@DanielHilgarth, xóa ví dụ không rõ ràng. Mặc dù trình biên dịch sẽ cho phép bạn gọi phương thức tĩnh thông qua một lớp dẫn xuất, nhưng vẫn đúng là các thành viên tĩnh không được kế thừa. IL được tạo ra sẽ thực sự gọi phương thức trên lớp cơ sở. Và một lần nữa, mặc dù trình biên dịch cho phép nó, tham chiếu các phương thức tĩnh từ kiểu dẫn xuất có dạng xấu và có thể dẫn đến nhầm lẫn, đặc biệt là khi sử dụng các mẫu tạo. – roken

+0

Bạn đúng trong nhận xét của mình khi bạn nói trình biên dịch sẽ thay đổi 'Foo.MyStaticMethod()' thành 'BusinessObject.MyStaticMethod()'. Tuy nhiên, điều này không làm cho câu trả lời của bạn chính xác. Nó chỉ đơn giản là không chính xác, mà bạn chỉ có thể tham khảo (bạn có nghĩa là "gọi"?) 'MyStaticMethod' từ' BusinessObject'. –

+0

O là thông số kiểu chung. Như chúng ta đã đồng ý, không có kế thừa các phương thức tĩnh giữa các kiểu, do đó bạn không thể mong đợi để có thể gọi phương thức này trên một số kiểu O có nguồn gốc từ BusinessObject trong ngữ cảnh này. Nhóm biên dịch có thể đã cung cấp một số phép thuật ở đây như họ đã làm trong trường hợp rõ ràng-loại tên, nhưng [may mắn] họ không. Tôi sẽ đồng ý câu trả lời của tôi không phải là tiết tấu như nó có thể được, nhưng tôi vẫn sẽ không gọi nó là không chính xác. – roken

12

Bạn không thể truy cập phương thức tĩnh thông qua thông số loại chung ngay cả khi nó bị ràng buộc với một loại. Chỉ cần sử dụng lớp hạn chế trực tiếp

var s = BusinessObject.MyStaticMethod(); 

Lưu ý: Nếu bạn đang tìm kiếm để gọi phương thức tĩnh dựa vào loại instantiated của O đó là không thể không suy nghĩ. Generics in .Net liên kết tĩnh với các phương thức tại thời gian biên dịch (không giống như nói C++ liên kết tại thời điểm khởi tạo). Vì không có cách nào để liên kết tĩnh với một phương thức tĩnh trên kiểu instantiated, điều này là không thể. Các phương thức ảo có một chút khác biệt vì bạn có thể liên kết tĩnh với một phương thức ảo và sau đó cho phép công văn động gọi đúng phương thức trên loại được khởi tạo.

+0

Đoán tôi không cung cấp đủ thông tin. Kiểm tra câu hỏi được cập nhật trong giây lát ... –

+0

@BrandonMoore đã cập nhật câu trả lời của tôi một chút chi tiết hơn về các giới hạn – JaredPar

+0

Đúng, và vì tôi không thể có phương pháp tĩnh ảo loại bỏ cách tiếp cận của mình. Tôi nghĩ sự phản chiếu sẽ là con đường để đi. –

2

Nếu bạn đang buộc O kế thừa từ BusinessObject, tại sao không chỉ cần gọi nó như thế này:

void SomeMethod() 
{ 
    var s = BusinessObject.MyStaticMethod(); // <- How to do this? 
} 
+0

Xem câu hỏi cập nhật –

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