2011-12-14 32 views
30

Tôi có chương trình C#, làm cách nào để kiểm tra thời gian chạy nếu không gian tên, lớp hoặc phương thức tồn tại? Ngoài ra, làm thế nào để nhanh chóng một lớp học bằng cách sử dụng tên của nó ở dạng chuỗi?C# - Làm thế nào để kiểm tra xem không gian tên, lớp hoặc phương thức tồn tại trong C#?

Mã giả:

string @namespace = "MyNameSpace"; 
string @class = "MyClass"; 
string method= "MyMEthod"; 

var y = IsNamespaceExists(namespace); 
var x = IsClassExists(@class)? new @class : null; //Check if exists, instantiate if so. 
var z = x.IsMethodExists(method); 
+0

Hãy nhớ để đánh dấu câu trả lời thích hợp nhất như một câu trả lời. –

Trả lời

39

Bạn có thể sử dụng Type.GetType(string) để phản ánh một lớp học. Type có các phương pháp để khám phá các thành viên khác, bao gồm một phương pháp, có sẵn cho loại đó.

Một thủ thuật, tuy nhiên, là GetType muốn có tên đủ điều kiện lắp ráp. Nếu bạn chỉ sử dụng tên lớp, nó sẽ cho rằng bạn đang tham chiếu đến assembly hiện tại.

Vì vậy, nếu bạn muốn tìm loại trong tất cả các assembly được nạp, bạn có thể làm một cái gì đó như thế này (sử dụng LINQ):

var type = (from assembly in AppDomain.CurrentDomain.GetAssemblies() 
      from type in assembly.GetTypes() 
      where type.Name == className 
      select type); 

Tất nhiên, có thể có nhiều điều hơn thế, nơi bạn sẽ muốn phản ánh qua các hội đồng được tham chiếu có thể chưa được tải, v.v.

Để xác định các không gian tên, phản ánh không xuất khẩu rõ ràng. Thay vào đó, bạn sẽ phải làm một cái gì đó như:

var namespaceFound = (from assembly in AppDomain.CurrentDomain.GetAssemblies() 
from type in assembly.GetTypes() 
where type.Namespace == namespace 
select type).Any() 

Đưa nó tất cả cùng nhau, bạn sẽ có cái gì như:

var type = (from assembly in AppDomain.CurrentDomain.GetAssemblies() 
       from type in assembly.GetTypes() 
       where type.Name == className && type.GetMethods().Any(m => m.Name == methodName) 
       select type).FirstOrDefault(); 

if (type == null) throw new InvalidOperationException("Valid type not found."); 

object instance = Activator.CreateInstance(type); 
+2

Và làm thế nào bạn sẽ xác định nếu một không gian tên tồn tại với các ví dụ của bạn? –

+0

Đã cập nhật câu trả lời của tôi. Kiểm tra ví dụ mã thứ hai. Chúng ta liệt kê từng assembly được nạp, và mỗi loại trong mỗi assembly, và tìm kiếm bất kỳ kiểu nào có tên namespace mong muốn. – HackedByChinese

+1

Nếu bạn muốn kiểm tra xem không gian tên có hợp lệ không, tên lớp là hợp lệ và lớp có phương thức, bạn có thể thực hiện tất cả trong một ảnh với ví dụ mã thứ ba. chỉ cần thay đổi nơi type.Name == className thành một cái gì đó như 'where type.FullName == string.Format (" {0}. {1} ", namespace, className) && type.GetMethods(). Any (m => m .Name == methodName) '. Ngoài ra, tôi đã phạm sai lầm trong những ví dụ đó bằng cách bỏ qua phần 'chọn' của câu lệnh. sửa chữa. – HackedByChinese

2

Một từ: Reflection. Ngoại trừ Không gian tên, bạn sẽ phải phân tích cú pháp những tên này khỏi tên Loại.

CHỈNH SỬA: Cảnh báo rằng - đối với không gian tên, bạn sẽ phải sử dụng thuộc tính Type.Namespace để xác định không gian tên mà mỗi lớp thuộc về. (Xem HackedByChinese response để biết thêm thông tin).

+0

+1 Cảm ơn! Phản ánh có vẻ thú vị. – dpp

25

Bạn có thể giải quyết Type từ chuỗi bằng cách sử dụng phương thức Type.GetType(String). Ví dụ:

Type myType = Type.GetType("MyNamespace.MyClass"); 

Sau đó, bạn có thể sử dụng loại trường hợp này để kiểm tra xem một phương pháp tồn tại trên các loại bằng cách gọi phương pháp GetMethod(String). Ví dụ:

MethodInfo myMethod = myType.GetMethod("MyMethod"); 

Cả GetType và GetMethod trở null nếu không có loại hoặc phương pháp đã được tìm thấy cho tên nhất định, do đó bạn có thể kiểm tra nếu loại/phương pháp của bạn tồn tại bằng cách kiểm tra nếu lời gọi phương thức của bạn trở null hay không.

Cuối cùng, bạn có thể nhanh chóng loại bạn sử dụng Activator.CreateInstance(Type) Ví dụ:

object instance = Activator.CreateInstance(myType); 
+1

Đây là câu trả lời nhanh hơn và ngắn gọn hơn câu trả lời chính xác ở trên. Quay tất cả các loại trong mỗi lắp ráp là đau đớn chậm. Nếu bạn bao gồm tất cả các hệ thống hội đồng, có thể là một vòng lặp lặp 10.000. – Deane

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