2012-02-14 28 views
15
Type.GetType("TheClass"); 

Returns null nếu namespace không trình bày như:Tránh đưa ra tên namespace trong Type.GetType()

Type.GetType("SomeNamespace.TheClass"); // returns a Type object 

Có cách nào để tránh cho tên namespace?

+4

bạn có nhận ra rằng bạn có thể có nhiều lớp khác nhau được gọi là TheClass trong một dự án mà nhiều tài liệu tham khảo đã được thêm vào và tệp mà bạn cố giải quyết loại có nhiều câu lệnh? Bạn nên chuyển tên đầy đủ, bao gồm cả không gian tên như khi bạn tự tham khảo trong tài liệu bạn viết Tên và Họ. Nên sử dụng trình biên dịch nào trong số nhiều lớp TheClass trong trường hợp có nhiều lớp? Không gian tên cho biết cái nào. –

+0

Tôi sẽ ném 'ArgumentException' thay vì chỉ trả về' null'. Bạn không thể phân biệt mà không có 'Không gian tên ' – gdoron

+0

có thể trùng lặp của [Lấy một System.Type từ tên một phần của loại] (http://stackoverflow.com/questions/179102/getting-a-system-type-from-types-partial -name) – nawfal

Trả lời

-1

Đó là thông số mà phương thức mong đợi nhận được, vì vậy không. Bạn không thể.

typeName: nhập tên đủ điều kiện theo không gian tên của nó.

MSDN

Làm thế nào để bạn mong đợi để phân biệt giữa hai lớp có cùng tên nhưng Namespace khác nhau?

namespace one 
{ 
    public class TheClass 
    { 
    } 
} 

namespace two 
{ 
    public class TheClass 
    { 
    } 
} 

Type.GetType("TheClass") // Which?! 
+0

Theo nhu cầu của tôi không có tình huống như thế này. –

+0

Theo nhu cầu của tôi sẽ không có bất kỳ tình huống nào như thế này. Do đó trong trường hợp đó làm thế nào tôi có thể đi về nó? –

+4

@NIleshLanke, tôi hy vọng bạn nhận ra rằng Microsoft đã không thiết kế khuôn khổ .NET theo ** nhu cầu ** của bạn nhưng nó đã được kiến ​​trúc để được sử dụng trong một kịch bản rộng hơn nhiều. Ví dụ như một kịch bản mà bạn có cùng tên lớp trong hai không gian tên khác nhau. –

39

Tôi đã sử dụng một phương pháp helper khiến các tìm kiếm tất cả nạp Assembly s cho một Type phù hợp với tên được chỉ định. Mặc dù trong mã của tôi chỉ có một kết quả Kiểu được mong đợi nó hỗ trợ nhiều. Tôi xác minh rằng chỉ có một kết quả được trả lại mỗi khi tôi sử dụng nó và đề nghị bạn làm như vậy.

/// <summary> 
/// Gets a all Type instances matching the specified class name with just non-namespace qualified class name. 
/// </summary> 
/// <param name="className">Name of the class sought.</param> 
/// <returns>Types that have the class name specified. They may not be in the same namespace.</returns> 
public static Type[] getTypeByName(string className) 
{ 
    List<Type> returnVal = new List<Type>(); 

    foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies()) 
    { 
     Type[] assemblyTypes = a.GetTypes(); 
     for (int j = 0; j < assemblyTypes.Length; j++) 
     { 
      if (assemblyTypes[j].Name == className) 
      { 
       returnVal.Add(assemblyTypes[j]); 
      } 
     } 
    } 

    return returnVal.ToArray(); 
} 
+19

+1 để trả lời câu hỏi thay vì xếp chồng vào cuộc chiến tranh trên. –

+2

câu trả lời khác là từ một người biết thay vì không sử dụng không có không gian tên bla bla :) ty cho câu trả lời – MonsterMMORPG

+0

tuyệt vời, làm những gì nó nói. Điều chính tôi sẽ thêm vào điều này sẽ là sử dụng assemblyTypes [j] .Name.EqualsIgnoreCase (className). – sirthomas

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