Làm cách nào để lấy tất cả các lớp trong một không gian tên?


Câu trả lời:


142

Bạn sẽ cần phải làm điều đó "ngược"; liệt kê tất cả các kiểu trong một assembly và sau đó kiểm tra không gian tên của mỗi kiểu:

using System.Reflection;
private Type[] GetTypesInNamespace(Assembly assembly, string nameSpace)
{
    return 
      assembly.GetTypes()
              .Where(t => String.Equals(t.Namespace, nameSpace, StringComparison.Ordinal))
              .ToArray();
}

Ví dụ về cách sử dụng:

Type[] typelist = GetTypesInNamespace(Assembly.GetExecutingAssembly(), "MyNamespace");
for (int i = 0; i < typelist.Length; i++)
{
    Console.WriteLine(typelist[i].Name);
}

Đối với bất kỳ thứ gì trước khi .Net 2.0 Assembly.GetExecutingAssembly()không khả dụng, bạn sẽ cần một giải pháp nhỏ để có được assembly:

Assembly myAssembly = typeof(<Namespace>.<someClass>).GetTypeInfo().Assembly;
Type[] typelist = GetTypesInNamespace(myAssembly, "<Namespace>");
for (int i = 0; i < typelist.Length; i++)
{
    Console.WriteLine(typelist[i].Name);
}

2
.Where (t => String.Equals (t.Namespace, nameSpace, StringComparison.Ordinal)
abatishchev

8
Ngoài ra, hãy nhớ rằng không gian tên Assembly! = - một số không gian tên nằm trên nhiều tập hợp.
Bevan

1
và tại sao không trả về chỉ một IEnumerable <Type>? Hơn nữa, bạn thực hiện một phép liệt kê giữa các kết quả, cũng là "foreach" thay vì "for" thì tốt hơn, tôi nghĩ vậy.
abatishchev

2
Nhận xét tốt, cảm ơn vì điều đó. Bằng cách tạo kiểu trả về thành IEnumerable <Type> loại bỏ nhu cầu gọi ToArray cuối cùng. Không chắc liệu tôi có đồng ý rằng 'foreach' tốt hơn 'for' hay không; vì tôi thấy sự khác biệt về hiệu suất là không thể xác định được nên tôi nghĩ nó phụ thuộc vào phong cách cá nhân. Nhưng có thể có một lập luận tốt cho việc thích 'foreach' hơn; nếu vậy, hãy chia sẻ nó; Tôi muốn được chứng minh là sai :)
Fredrik Mork

3
Tôi nghĩ rằng foreach dễ dàng hơn để xem xét cá nhân. Ở hậu trường, hai vòng lặp khá giống nhau về hiệu suất.
Chev

5

Bạn sẽ cần cung cấp thêm một chút thông tin ...

Ý bạn là bằng cách sử dụng Reflection. Bạn có thể lặp qua một Bản kê khai hợp ngữ và nhận danh sách các loại bằng cách sử dụng

   System.Reflection.Assembly myAssembly = Assembly.LoadFile("");

   myAssembly.ManifestModule.FindTypes()

Nếu đó chỉ là trong Visual Studio, bạn chỉ có thể lấy danh sách trong cửa sổ intellisense hoặc bằng cách mở Trình duyệt đối tượng (CTRL + W, J)


0

Với Reflection, bạn có thể lặp lại tất cả các kiểu trong một assembly. Một kiểu có thuộc tính Không gian tên mà bạn sử dụng để lọc chỉ vùng tên mà bạn quan tâm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.