5

Từ microsoft documentation, Type.GetType có thể phân biệt chữ hoa chữ thường trong .NET 4.5. Thật không may, điều này không có sẵn trong WinRT (Metro/Modern UI/Store apps).Loại.Không phân biệt chữ hoa chữ thường - WinRT

Có cách giải quyết nào không? Bởi vì tôi phải khởi tạo các đối tượng từ một giao thức có tất cả các biểu diễn chuỗi trong chữ hoa.

Ví dụ: từ "MYOBJECT", tôi phải khởi tạo MyObject.

Tôi hiện đang sử dụng Activator.CreateInstance(Type.GetType("MYOBJECT")), nhưng do độ nhạy trường hợp, nó không hoạt động.

Cảm ơn

Trả lời

5

Bạn có biết lắp ráp bạn đang tải loại không? Nếu vậy, bạn chỉ có thể tạo một trường hợp không phân biệt chữ hoa chữ thường Dictionary<string, Type> (sử dụng StringComparer.OrdinalIgnoreCase) bằng cách gọi Assembly.GetTypes() một lần. Sau đó, bạn không cần phải sử dụng Type.GetType() ở tất cả - chỉ cần tham khảo ý kiến ​​từ điển:

// You'd probably do this once and cache it, of course... 
var typeMap = someAssembly.GetTypes() 
          .ToDictionary(t => t.FullName, t => t, 
             StringComparer.OrdinalIgnoreCase); 

... 

Type type; 
if (typeMap.TryGetValue(name, out type)) 
{ 
    ... 
} 
else 
{ 
    // Type not found 
} 

EDIT: Đã thấy rằng đây là tất cả trong không gian tên tương tự, bạn có thể dễ dàng lọc rằng:

var typeMap = someAssembly.GetTypes() 
          .Where(t => t.Namespace == "Foo.Bar") 
          .ToDictionary(t => t.Name, t => t, 
             StringComparer.OrdinalIgnoreCase); 
+0

@NicolasVoron: Tại sao nó sẽ là đau đớn? Chỉ cần có bao nhiêu loại và có bao nhiêu loại bạn đang tìm nạp? (Tôi đã giả sử bạn đang tìm nạp nhiều loại khác nhau theo tên.) –

+0

Hmmm ... Hoàn toàn hiểu lầm câu trả lời của bạn. Xin lỗi vì điều đó. Đây là một giải pháp rất tốt. Chỉnh sửa của bạn hoàn toàn phù hợp với nhu cầu của tôi;) Cảm ơn rất nhiều! –

4

Bạn có thể sử dụng phương pháp GetTypes(), để tìm nạp tất cả các loại có thể trong hội đồng nơi bạn nhập, sau đó kiểm tra loại chữ hoa nào bằng chữ hoa chữ thường của bạn rồi sử dụng phương thức GetType.

0

Hãy xem xét rằng tên lớp thực tế là Car và chuỗi truy vấn của bạn là CAR. Vì chúng khác nhau về độ nhạy của chữ, Type.GetType() sẽ trả về null. Để giải quyết điều này trước hết hãy lọc tất cả các lớp từ không gian tên Car (Giả sử rằng không gian tên là Vehicle).

var varClasses = from t in Assembly.GetExecutingAssembly().GetTypes() 
       where t.IsClass && t.Namespace == "Vehicles" 
       select t; 

Chuyển đổi đến một List

List<Type> lstClasses = varClasses.ToList(); 

Khai báo một biến để có được tên thực tế của lớp và sử dụng một vòng lặp để so sánh chuỗi mà không trường hợp nhạy cảm.

string strActualName = ""; 
foreach (Type t in lstClasses) 
{ 
    if (t.Name.ToLower() == "CAR".ToLower()) 
    { 
      strActualName = t.Name; 
      break; 
    } 
} 

Bây giờ với chuỗi mới, sử dụng Type.GetType()

Type t1 = Type.GetType("Vehicles." + strActualName);