2016-02-17 17 views
6

Tôi muốn viết những phương pháp sau đâyLàm thế nào để thực hiện một phương pháp chung chung mà phải mất một kiểu generic

private void Foo<T, TItem>(T<TItem> param1) 

đâu T phải là một kiểu chung chung mà sẽ đưa TItem như thông tin tổng quát của nó.

Gọi dụ sẽ như thế nào:

private void Main() 
{ 
    List<int> ints = new List<int>(); 
    Foo<List, int>(ints);  
} 

Edit: Trong trường hợp của tôi, tôi sẽ chỉ cần cho bộ sưu tập. Trường hợp sử dụng thực tế là tôi muốn viết một phương thức bổ sung một số thứ vào ICollection đáng buồn là ICollection không có phương thức .Add chỉ có ICollection<T>.

tôi không thể thay đổi phương pháp để:

private Foo<T>(ICollection<T>) 

từ với mà tôi đang làm mất thông tin gì gõ danh sách thực tế là, đó là điều quan trọng với tôi hơn những gì gõ các mục trong danh sách.

để ý tưởng trên được sinh ra, ý tưởng này không hiệu quả.

+0

Tôi không nghĩ rằng có thể cho rằng 'List' luôn hy vọng một tham số chung. – MutantNinjaCodeMonkey

+1

Tôi không nghĩ rằng bạn có thể làm cho hạn chế đó. Điều gì về việc có T là một loại chung mà thực hiện IInterface nơi T xuất phát từ TItem? –

+0

Tôi không thực sự hiểu làm thế nào 'Foo' sẽ yêu cầu' T' và 'TItem' có liên quan theo cách được mô tả; bạn có thể đưa ra một ví dụ cụ thể hơn không? – Codor

Trả lời

7

Vì bạn cần phải có cho chỉ các bộ sưu tập, bạn có thể mô tả một phương pháp như thế này:

private void Foo<T, TItem>(T param1) 
    where T: ICollection<TItem> 
{ 
} 

Tuy nhiên trong trường hợp này bạn cần phải cung cấp loại generic cụ thể (List<int>) như tham số chung đầu tiên, bạn có thể không chỉ sử dụng List:

List<int> ints = new List<int>(); 
Foo<List<int>, int>(ints); 
+0

'' IEnumerable '' ?? –

+0

@EhsanSajjad Vì 'ICollection ' thực hiện 'IEnumerable ' bạn có thể sử dụng cái này hay cái kia, phụ thuộc vào yêu cầu – dotnetom

+0

Giải pháp này có vẻ hiệu quả, nhưng tôi phải ghi rõ thông tin kiểu chung, có thể xung quanh nó? –

0

Dường như với tôi giống như bạn bị kẹt trong bẫy nhớ. Có lẽ có một cách tốt hơn để giải quyết bất cứ điều gì bạn đang cố gắng làm.

Dù sao, hãy thử sử dụng Dictionary. Bạn không cần thực sự viết một phương thức.

int number = 15; 
double dub = 15.5; 
Button button = new Button(); 

Dictionary<object, Type> typeGlossary = new Dictionary<object, Type>(); 
typeGlossary.Add(number, typeof(int)); 
typeGlossary.Add(dub, typeof(double)); 
typeGlossary.Add(button, typeof(Button)); 

Cuối cùng, bộ não được mã hóa chuyển tiếp của bạn sẽ từ bỏ việc cố gắng loại bỏ hệ thống mạnh mẽ của C#. Chúng ta đều làm điều đó tại một số điểm.

1

Có thể điều này có thể giúp:

Tạo lớp cơ sở và lớp dẫn xuất.

public class Item 
{ 

} 

public class Item<T> : Item 
{ 
    T Value; 

    public Item(T value) 
    { 
     Value = value; 
    } 
} 

Sau đó bạn có thể sử dụng nó như thế nào bạn muốn:

public class SomewhereElse 
{ 
    public void Main() 
    { 
     List<Item> itemCollection = new List<Item>(); 
     itemCollection.Add(new Item<int>(15)); 
     itemCollection.Add(new Item<string>("text")); 
     itemCollection.Add(new Item<Type>(typeof(Image))); 
     itemCollection.Add(new Item<Exception>(new StackOverflowException())); 
     itemCollection.Add(new Item<FormWindowState>(FormWindowState.Maximized)); 
     // You get the point.. 
    } 
} 
Các vấn đề liên quan