2015-06-03 17 views
7

Tôi đang sử dụng mã bên dưới. Nó được thiết kế cho một loại nhất định để hạn chế nó popup-Ness trong IntelliSense, vvPhương pháp mở rộng cho hai loại chính xác khác nhau

public static Generic Get<Generic>(this Entity input) 
{ 
    return (Generic)input; 
} 

Bây giờ tôi muốn sử dụng cùng một Nhận phương pháp cho loại hình khác (hoặc, để được bảo hiểm đầy đủ, một vài khác các loại nhưng vẫn là số sửa lỗi). Vì vậy, tôi đã thêm một phương thức thứ hai và mã trông như sau.

public static Generic Get<Generic>(this Entity input) 
{ 
    return (Generic)input; 
} 

public static Generic Get<Generic>(this Entity2 input) 
{ 
    return (Generic)input; 
} 

Tôi cho rằng cách tiếp cận tốt hơn là giữ nó trong cùng một thân phương pháp và vẫn bao gồm tất cả các loại được đánh giá. Có cú pháp để bao gồm ví dụ: hai loại khác nhau trong chữ ký? Một cái gì đó như thế này pseudo-code dưới đây.

public static Generic Get<Generic>(this [Entity, Entity2] input) 
{ 
    return (Generic)input; 
} 

Cách tiếp cận tốt nhất tôi có thể nghĩ, như được hiển thị bên dưới, bao gồm phương pháp nhập cho từng loại và logic ở nơi riêng tư. Nó có ý nghĩa khi logic là rộng rãi nhưng trông loại thừa khi nó chỉ là một hoặc hai dòng.

public static Generic Get<Generic>(this Entity input) 
{ 
    return CommonLogic(input); 
} 

public static Generic Get<Generic>(this Entity2 input) 
{ 
    return CommonLogic(input); 
} 

private static Generic CommonLogic(Object input) 
{ 
    return (Generic)input; 
} 
+0

Tôi sẽ đi với cách tiếp cận cuối cùng chắc chắn, hoặc đặt nó trên đối tượng? –

+1

có bất kỳ điểm chung nào giữa 'Entity' và' Entity2' không? –

+6

Bạn có kiểm soát nguồn của các lớp EntityX không? Nếu có, bạn có thể tạo một giao diện điểm đánh dấu (trống) và chỉ có các lớp đó thực hiện giao diện. Sau đó có loại tham số phương thức mở rộng 'này' của giao diện đó. – user469104

Trả lời

5

C# không hỗ trợ ký hiệu [Entity, Entity2], do đó tùy chọn đó không có.

Nếu EntityEntity2 chia sẻ một giao diện phổ biến hay lớp cơ sở, sau đó khai báo nó như:

public static Generic Get<Generic>(this IEntityCommon input) 
{ 
    return (Generic)input; 
} 

Nếu không được và bạn đã tạo Entity, Entity2 vv, sau đó thêm một giao diện chung. Giao diện này không cần định nghĩa bất kỳ phương thức nào và có thể trống, nó chỉ đơn giản là cung cấp một kiểu chung cho phương thức mở rộng.

Không làm được điều đó, cách "CommonLogic" là lựa chọn tốt nhất của bạn.

+0

Ký hiệu chỉ là một mã giả để rút ngắn lời giải thích. Các lớp học không có giao diện chung dành riêng cho họ và vì logic rất ngắn, tôi đoán không có điểm nào làm cho nỗ lực làm đúng mọi thứ. Tuy nhiên, nó là tốt để biết trong một trường hợp chung. –

3

bạn có thể làm một cái gì đó như thế

public static TSearch Get<TSource, TSearch>(this TSource obj) where TSource : BaseType, ISomeInterface 
    { 

    } 

T bây giờ có thể chỉ là kiểu BaseType và thực hiện ISomeInterface, nhưng điều này sẽ không làm cho nó aviable được giới hạn trong một số sửa chữa của các lớp học hỗ trợ

EDIT:

bây giờ bạn có thể sử dụng trên các đối tượng của loại BaseType thực hiện ISomeInterface và Retu rn Kiểu được yêu cầu TSearch. Tuy nhiên, bạn cũng có thể chỉ sử dụng where TSource : ISomeInterface. Đầu mối là các lớp Entity của bạn thực hiện giao diện này.

Kiểm tra where - generic type constratint để hiểu cách sử dụng.

+1

Để làm việc này, bạn cần hai loại chung chung. Đầu vào và đầu ra. Ngay bây giờ điều này có một cái gì đó của một loại nhất định và trả về cùng một loại, mà không phải là những gì mã OPs nào. – juharr

+0

@juharr nó bây giờ sẽ phù hợp (Nếu lớp 'Entity' của anh ta là typeof' BaseType' và 'ISomeInterface') – LuckyLikey

+1

Bạn phải chỉ định' TSource' làm kiểu chung trên phương thức 'public static TSearch Get (tsource obj này) ' – juharr

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