2010-04-30 28 views
5

Tôi muốn kết hợp dữ liệu tùy chỉnh với một Loại và truy xuất dữ liệu đó trong thời gian chạy, nhanh chóng.Cách hiệu quả nhất để kết hợp thông tin với đối tượng 'Loại' trong .Net là gì?

Đây chỉ là trí tưởng tượng của tôi, của thế giới hoàn hảo của tôi:

var MyInfo = typeof (MyClass) .GetMyInformation();

điều này sẽ rất nhanh ... tất nhiên điều này không tồn tại! Nếu nó đã làm tôi sẽ không được yêu cầu. hehe;)

Đây là cách sử dụng thuộc tính tùy chỉnh:

var MyInfo = typeof (MyClass) .GetCustomAttribute ("MyInformation");

này là chậm vì nó đòi hỏi một tra cứu của chuỗi "MyInformation"

Đây là một cách sử dụng một từ điển < Type, MyInformation>:

var MyInfo = myInformationDictionary [ typeof (MyClass)];

Điều này cũng chậm vì đây vẫn là tra cứu 'typeof (MyClass)'.

Tôi biết rằng từ điển rất nhanh, nhưng điều này là không đủ ... nó không phải là nhanh như gọi một phương pháp. Nó thậm chí không phải là cùng một thứ tự tốc độ.

Tôi không nói rằng tôi muốn nó nhanh như cuộc gọi phương thức. Tôi muốn kết hợp thông tin với một loại và truy cập thông tin càng nhanh càng tốt. Tôi đang hỏi liệu có một cách tốt hơn hay là một cách tốt nhất để làm điều đó.

Bất kỳ ý tưởng nào ??

Cảm ơn!

EDIT:

Các typeof (MyClass) tôi đã đề cập trong tất cả các đoạn trước, là biến actualy ... Tôi không biết rằng nó là một loại MyClass cụ thể, nó có thể là bất kỳ loại:

Nhập myType = typeFromSomewhere;

tức là MyClass trong trường hợp này chỉ nói rằng lớp học được tạo bởi tôi và bất kỳ loại nào khác có thể xảy ra trong trường hợp này cũng do tôi ...nên nó đọc

typeof (Một trong lớp My Own, mà tôi không biết phù thủy một là nó, nhưng nó là của tôi chắc chắn)

EDIT: KẾT LUẬN

Một số kết quả hiệu suất liên quan đến từ điển:

Dic.buckets | Dic.Count | Dic.Key | Ops(x17)/s | Avg.Time | Min.Time | Max.Time 
----------------------------------------------------------------------------- 
    17519 | 12467 | Type | 1051538 | 0.95μs | 0.86μs | 0.42ms 
     919 |  912 | Type |  814862 | 1.23μs | 1.14μs | 0.46ms 
    1162687 |  912 | Type | 1126382 | 0.89μs | 0.81μs | 0.33ms 
     919 |  912 | Type |  806992 | 1.24μs | 1.16μs | 0.21ms 
     17 |  17 | Type |  872485 | 1.15μs | 1.06μs | 0.31ms 
----------------------------------------------------------------------------- 
    36353 | 18160 | String |  227520 | 4.40μs | 3.98μs | 0.47ms 
     919 |  911 | String |  219159 | 4.57μs | 4.14μs | 0.29ms 
    1162687 |  911 | String |  236384 | 4.23μs | 3.82μs | 0.41ms 
     919 |  911 | String |  223042 | 4.49μs | 4.10μs | 0.43ms 
     17 |  17 | String |  229985 | 4.35μs | 3.94μs | 0.28ms 

Giao diện C tất cả:

ops(x17)/s: 2896001 
Average: 0.35μs 
Min: 0.34μs 
Max: 1.20μs 

Gọi ảo:

ops(x17)/s: 3115254 
Average: 0.32μs 
Min: 0.32μs 
Max: 0.65μs 

tôi thấy rằng tôi có Từ điển dưới ước !!! =)

Dường như từ điển loại cho mọi thứ chậm hơn từ 3 đến 4 lần so với cuộc gọi phương thức ảo.

Đây không phải là trường hợp sử dụng Từ điển chuỗi. Những thứ đó chậm hơn từ 10 đến 12 lần so với cuộc gọi phương thức ảo.

Vì vậy, tôi đã yêu cầu tôi sai!

Và, KHÔNG TÔI KHÔNG LÀM MISSILE !!! ai đó đã giả định điều này trong một bình luận dưới đây =)

Cảm ơn tất cả mọi người.

+3

Nếu hiệu suất là trái tim của vấn đề này xin vui lòng gửi yêu cầu hiệu suất cứng (ví dụ: số lượng tối thiểu là lặp đi lặp lại mỗi giây) mà giải pháp sẽ được đánh giá. –

+2

Tôi rất muốn biết loại chương trình siêu bạn đang viết có hiệu quả như vậy mà một từ điển được coi là quá chậm. Nó phải giống như một tên lửa hoặc thứ gì đó phải thực hiện hàng triệu phép tính một giây bằng cách sử dụng dữ liệu này. –

+0

Bạn có thực sự triển khai và đo các thuộc tính hoặc từ điển đó "quá chậm" không? Trừ khi từ điển của bạn chứa một số lượng rất lớn các mục tôi nghi ngờ rằng bạn sẽ chạy vào các vấn đề hiệu suất. –

Trả lời

5

Dictionary<Type,Object> phù hợp với tôi.

+0

Thật vậy! Tôi đã sai ... tiền đề của tôi dựa trên một số thử nghiệm cũ mà tôi nhớ lại. Thử nghiệm được thực hiện một lần nữa và đăng! –

2

Khai báo các thuộc tính hoặc phương pháp tĩnh trên loại của bạn.

class YourType 
{ 
    public static string GetMyInformation() 
    { 
    return "Some info on this type"; 
    } 
} 

Sau đó, bạn có thể truy cập dữ liệu trong mã của bạn như sau

var myInfo = YourType.GetMyInformation(); 

Hoặc tôi đã bỏ lỡ điểm?

+1

Bạn đã bỏ lỡ điểm trong thực tế là tôi có một biến Loại: tức là var myType = typeof (cái gì đó) ...loại không phải là một loại cố định. –

+0

@Miguel, ok xin lỗi về điều đó. Tôi đã bỏ qua các chi tiết quan trọng ... –

+0

Không phải lỗi của bạn, tôi đã không đề cập đến điều đó trước đây ... nhưng tôi đã làm cho nó rõ ràng hơn bây giờ, tôi nghĩ! –

5

Nó không chỉ là "thế giới hoàn hảo của bạn", đó là C# quá! Bạn có thể sử dụng extension methods để làm cho công việc một cách chính xác những gì bạn đề nghị:

var myInfo = typeof(MyClass).GetMyInformation(); 

Trong một TypeUtilities lớp tĩnh hoặc tương tự, bạn sẽ xác định như sau:

public static InfoType GetMyInformation(this Type type) 
{ 
    // Return InfoType object. 
} 

Đối với cách bạn thực sự quay trở lại các thông tin trên loại, có thể được thực hiện theo nhiều cách. Một if-block đơn giản, một static Dictionary, phản ánh trên kiểu đã cho (sử dụng các thuộc tính/phương thức), hoặc thậm chí cả những cái khác. Cách tiếp cận tốt nhất phụ thuộc rất nhiều vào ngữ cảnh và kịch bản sử dụng cụ thể của bạn.

+0

Nhưng sau đó, làm cách nào để thực hiện hành vi khác nhau tùy thuộc vào loại. Tôi vẫn sẽ phải nhìn vào một bảng tra cứu, hoặc một cái gì đó. –

+2

Một từ điển hoặc một câu lệnh if đơn giản hoặc thậm chí một số phản ánh có thể là tốt nhất tùy thuộc vào kịch bản. Bạn có thể xây dựng được không? – Noldorin

+0

Tôi đã giải quyết được vấn đề với 4 cấu trúc đơn giản chỉ để lưu trữ các mục đã truy cập trước đây của từ điển ... bây giờ nó gần như nhanh như một cuộc gọi phương thức, phần lớn thời gian ... Tôi chỉ nói về hiệu suất. Cảm ơn! –

0

viết các phương pháp mở rộng cho System.Type sẽ thực hiện tất cả các thao tác đó cho bạn.

2

Um, làm thế nào về bạn sử dụng một cuốn từ điển của Dictionary<string, MyInformation>:

Bạn biết họ gõ bạn đang tìm kiếm đã được định nghĩa nếu bạn đang sử dụng phương pháp typeof.Thay vào đó, bạn có thể khai báo một số const string MY_CLASS_TYPE_NAME = "MyNamespace.MyClass"

Nó không phải là đẹp nhất, nhưng nó rất nhanh và không giới hạn chức năng của bạn.

+0

Bài kiểm tra của tôi cho thấy rằng việc sử dụng Dictionary of Types là cách tốt nhất để làm. –

2

Tại sao không sử dụng GetCustomAttributes(typeof(MyInformationAttribute), false)?

IMHO, việc sử dụng thuộc tính là cách đúng ngữ nghĩa để thể hiện thông tin như thế này. Chỉ cần chắc chắn rằng bạn sử dụng một lớp thuộc tính kín, vì nó cải thiện hiệu suất thời gian chạy.

Mặc dù, nó sẽ không khó, và có lẽ sẽ thích hợp hơn để tải xuống hoặc bằng cách nào đó, nếu không thì hãy lưu lại các thể hiện thuộc tính. Tôi thường làm điều này một lần bằng cách sử dụng một trường tĩnh khi ứng dụng được khởi tạo.

+0

Điều này không có sử dụng cho các loại BCL, tuy nhiên. Rất hạn chế trong khía cạnh đó. – Noldorin

+0

Tôi đã thử nghiệm tất cả các cách sử dụng sự phản chiếu và nó là FOR SURE, cách WORST (nói về hiệu suất) của việc kết hợp thông tin với một Type. Dù sao ... cảm ơn vì đã cố gắng! –

4

Nếu loại là tĩnh có sẵn sau đó xem xét sử dụng một cái gì đó như thế nào,

public class Data<T, V> 
{ 
    public static V Info; 
} 

được sử dụng như thế nào,

Data<int, string>.Info = "A string associated with int"; 
Data<string, string>.Info = "A string associated with string"; 

và được truy cập như thế nào,

Console.WriteLine(Data<int, string>.Info); 
Console.WriteLine(Data<string, string>.Info); 

này hoạt động vì các biến tĩnh của một lớp chung là duy nhất cho các tham số chung riêng biệt.

Nếu loại không có sẵn, bạn nên sử dụng Dictionary<Type, V> như được đề cập trong câu hỏi của bạn và được đề xuất bởi người khác.

+0

Rất thú vị để chỉ ra một cách để làm nó tĩnh, nhưng nó không phải là trường hợp. Từ điển được khóa theo Type thực sự là cách tốt nhất để làm điều đó ... Tôi đã sai, nó không phải là một thứ tự cường độ chậm hơn so với các cuộc gọi ảo, nó chỉ là 3-4 lần chậm hơn ... đó là đủ cho tôi. Cảm ơn! –

+2

Tôi thích phương pháp này, thực sự. Nó khá lén lút mặc dù, gần như là một hack ... sử dụng một tính năng CLR hơi tinh tế để hoàn thành nhiệm vụ khá độc đáo. – Noldorin

0

Khi mọi người khác đã nói, bạn có lẽ vi tối ưu hóa, nhưng vì chúng ta đều đi vào tinh thần của nó, tôi sẽ quá :)

Lớp loại NET có thể được luộc xuống để nó chạy loại xử lý có thể hiệu quả hơn loại đầy đủ nếu bạn không cần phản ánh ...

Từ điển hoặc bất kỳ thứ gì bạn đang sử dụng nhanh hơn khoảng 20% ​​so với Từ điển trong bài kiểm tra đơn giản mà tôi vừa chạy.

typeof(object).RuntimeTypeHandle; 
// and 
instance.GetType().RuntimeTypeHandle; 

thể được sử dụng ở vị trí của một loại dụ đầy đủ

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