Tôi muốn kiểm tra xem một kiểu được biết đến trong thời gian chạy có cung cấp một hàm tạo tham số không. Lớp Type
không mang lại bất kỳ điều gì hứa hẹn, vì vậy tôi giả sử tôi phải sử dụng sự phản chiếu?Làm cách nào để kiểm tra xem một loại có cung cấp một hàm tạo tham số không?
Trả lời
Các Type
lớp là phản ánh. Bạn có thể làm:
Type theType = myobject.GetType(); // if you have an instance
// or
Type theType = typeof(MyObject); // if you know the type
var constructor = theType.GetConstructor(Type.EmptyTypes);
Nó sẽ trả về null nếu không có hàm tạo tham số.
Nếu bạn cũng muốn tìm nhà xây dựng tư nhân, sử dụng hơi dài:
var constructor = theType.GetConstructor(
BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic,
null, Type.EmptyTypes, null);
Có một caveat với nhiều loại giá trị, mà aren't allowed to have a default constructor. Bạn có thể kiểm tra xem bạn có loại giá trị hay không bằng cách sử dụng thuộc tính Type.IsValueType
và tạo các phiên bản bằng cách sử dụng Activator.CreateInstance(Type)
;
điều này sẽ không tìm thấy ctors riêng fyi –
Điều này cũng sẽ không hoạt động đối với các loại giá trị. – leppie
Nhận xét đã được giải quyết ở trên. –
Có, bạn phải sử dụng Phản chiếu. Nhưng bạn đã làm điều đó khi bạn sử dụng GetType()
Cái gì như:
var t = x.GetType();
var c = t.GetConstructor(new Type[0]);
if (c != null) ...
này nên làm việc:
myClass.GetType().GetConstructors()
.All(c=>c.GetParameters().Length == 0)
Không phải ý của tôi, nhưng xin đừng xóa - đó là một vấn đề liên quan và một thông tin tốt đẹp. – mafu
Có, bạn phải sử dụng sự phản chiếu.
object myObject = new MyType();
Type type = myObject.GetType();
ConstructorInfo conInfo = type.GetConstructor(new Type[0]);
Tùy thuộc vào tình hình của bạn, bạn cũng có thể sử dụng một hạn chế loại generic:
public void DoSomethingWith<T>(T myObject) where T:new() {...}
Tờ khai phương pháp trên sẽ hạn chế các loại tham số cho bất kỳ đối tượng có thể được khởi tạo với một constructor parameterless. Ưu điểm ở đây là trình biên dịch sẽ nắm bắt bất kỳ nỗ lực nào để sử dụng phương thức với một lớp không có một hàm tạo tham số, miễn là loại được biết SOMEWHERE tại thời gian biên dịch, nó sẽ hoạt động và sẽ cảnh báo bạn vấn đề trước đó. Tất nhiên nếu loại thực sự chỉ được biết khi chạy (tức là bạn đang sử dụng Activator.CreateInstance() để khởi tạo một đối tượng dựa trên một chuỗi hoặc một kiểu được xây dựng) thì điều này sẽ không giúp bạn. Tôi thường sử dụng sự phản chiếu như là lựa chọn cuối cùng tuyệt đối, bởi vì một khi bạn đã đi đến vùng đất năng động, bạn phải ở lại trong vùng đất năng động; nó thường khó khăn hoặc thậm chí còn lộn xộn hơn để tự động khởi tạo một cái gì đó và sau đó bắt đầu xử lý nó một cách tĩnh lặng.
Thực tế, có một mẫu rất hữu ích để bắc cầu các vùng đất của lời gọi tĩnh và động: một lớp bộ nhớ đệm chung chung tĩnh (ví dụ: 'EqualityComparer.Default
type.GetConstructor(Type.EmptyTypes) != null
sẽ không thành công cho struct
s. Tốt hơn để mở rộng nó:
public static bool HasDefaultConstructor(this Type t)
{
return t.IsValueType || t.GetConstructor(Type.EmptyTypes) != null;
}
Thành công kể từ khi enum
s có hàm tạo tham số mặc định. Cũng tăng tốc nhẹ cho các loại giá trị kể từ khi cuộc gọi phản chiếu không được thực hiện.
Tôi cần tính các nhà thầu chỉ với chỉ thông số tùy chọn giống như các hàm tạo ít tham số thực.Để thực hiện việc này:
myClass.GetType().GetConstructors()
.All(c => c.GetParameters().Length == 0 || c.GetParameters().All(p => p.IsOptional))
- 1. Mathematica: Cách kiểm tra xem không có đối số nào được cung cấp cho một hàm không?
- 2. Làm cách nào để kiểm tra xem thông số mẫu có phải là một tham số của hai không?
- 3. Làm thế nào để kiểm tra xem một đối số được cung cấp trong cuộc gọi chức năng?
- 4. VB - Làm cách nào để kiểm tra xem các đối số tùy chọn có được cung cấp hay không?
- 5. Làm cách nào để kiểm tra các loại tham số của hàm?
- 6. Làm thế nào để kiểm tra xem một loại là một typedef int
- 7. Trong Node.js, được cung cấp một URL, làm thế nào để kiểm tra xem nó là một jpg/png/gif?
- 8. Kiểm tra xem tham số có phải là một mô-đun Python không?
- 9. Có cách nào để kiểm tra xem một hàm VBScript có được xác định không?
- 10. Chuyển một hàm (có tham số) làm tham số?
- 11. Không thể cung cấp đối số khi tạo một thể loại chung loại
- 12. Làm cách nào để kiểm tra xem một giá trị có phải là số không?
- 13. Làm cách nào để kiểm tra xem một tham số có chứa hai đoạn mã bằng Mockito không?
- 14. Làm cách nào để chỉ kiểm tra một hàm chuẩn?
- 15. Làm cách nào để kiểm tra xem một phương thức có tĩnh trong PHP không?
- 16. Làm thế nào để kiểm tra xem một biến là một số IEnumerable của một số loại
- 17. Cách kiểm tra tham số đã được cung cấp cho tập lệnh bash
- 18. Hình thức này có tệ không khi chỉ cung cấp một hàm tạo di chuyển?
- 19. Kiểm tra nhà cung cấp thành viên không có ASP.NET
- 20. Làm cách nào để kiểm tra xem liệu stdin có một số dữ liệu?
- 21. Nhà cung cấp loại: Cách tạo lại?
- 22. Bất kỳ cách nào khác để kiểm tra xem nhà cung cấp vị trí mạng có được bật không?
- 23. Cách nhanh nhất để kiểm tra xem một loại có bị blittable không?
- 24. làm cách nào để kiểm tra xem một SqlDataSource có trả lại dữ liệu không?
- 25. Làm cách nào để kiểm tra xem một trường có tồn tại hay không trong MongoDB?
- 26. Làm thế nào để bạn kiểm tra xem một số có thể chia hết cho một số khác (Python) không?
- 27. Làm cách nào để tạo một TestActorRef trong Scala cho một Actor với các tham số hàm tạo?
- 28. Kiểm tra xem một giá trị từ scanf có phải là một số không?
- 29. Có thể tham số hóa một bài kiểm tra nunit
- 30. Cách sáng tạo để kiểm tra xem số chỉ có một bit trên ký tự int
Tôi nghĩ rằng đó là đúng – kenny
Sidenote: Có một ràng buộc chung cho các nhà xây dựng parameterless. – CodesInChaos
là câu hỏi liệu loại ** chỉ ** có cung cấp một hàm tạo tham số hoặc nếu nó cung cấp một cái không? – BrokenGlass