Tôi có một phương thức có tham số ngoài cố gắng thực hiện chuyển đổi loại. Về cơ bản:.NET: Làm thế nào để bạn có được kiểu của một đối tượng null?
public void GetParameterValue(out object destination)
{
object paramVal = "I want to return this. could be any type, not just string.";
destination = null; // default out param to null
destination = Convert.ChangeType(paramVal, destination.GetType());
}
Vấn đề là thường ai đó sẽ gọi đây như:
string output;
GetParameterValue(output);
này sẽ thất bại vì:
destination.GetType()
đích là null, vì vậy chúng tôi không thể gọi .GetType()
trên đó. Chúng tôi cũng không thể gọi:
typeof(destination)
vì đích là tên biến không phải là tên loại.
Vì vậy, có cách nào để nhận loại đối tượng được đặt thành không? Tôi nghĩ rằng sẽ có một cách để biết loại vị trí lưu trữ là gì mà không có nó được gán bất cứ điều gì.
Chỉ cần cung cấp thêm một chút thông tin, tôi đang cố tạo phương thức tiện ích sẽ lấy thông số đầu ra của thủ tục được lưu trữ của Oracle. Vấn đề là DbParameter.Value
thuộc loại đối tượng.
Điều gì sẽ là lý tưởng sẽ cho các nhà phát triển để làm một cái gì đó như:
string val = GetParameterValue("parameterName");
Điều đáng chú ý là không có đúc các loại. Trong thực tế, bạn không biết lparam của "bằng", vì vậy tôi đã đi với:
string val;
GetParameterValue("parameterName", out val);
Và được tìm trong phương pháp, tôi sẽ biết loại đích của biến đầu ra. Tôi đoán đó là một giả định tồi tệ. Là một thay thế, tôi cũng đã viết phương pháp:
public T GetParameterValue<T>(string paramName)
Vì vậy, các nhà phát triển có thể làm:
string val = GetParameterValue<string>("parameterName");
Tôi thấy rõ ràng "chuỗi" khai được lặp đi lặp lại, đặc biệt là vì trong thực tế, đích nếu có thể là một tài sản đối tượng và kiểu dữ liệu oracle có thể thay đổi (nghĩ ORM):
MyObj.SomeProp = GetParameterValue<MyObj.SomeProp.GetType()>("parameterName");
Nhưng một lần nữa, nếu MyObj.SomeProp là null, mà .GetType()
cuộc gọi không thành. VM phải biết loại MyObj.SomeProp
, ngay cả khi nó rỗng, phải không? hoặc người nào khác sẽ bắt được ngoại lệ?
Để giải quyết một phần vấn đề của riêng tôi, tôi có thể làm:
MyObj.SomeProp = GetParameterValue<typeof(MyObj).GetField("SomeProp").GetType()>("parameterName");
Toàn bộ ý tưởng là để không phải sử dụng một cách rõ ràng Gõ vào nhiều hơn một nơi, do đó nếu những thay đổi kiểu dữ liệu , nó chỉ phải được thay đổi trong đối tượng đích (MyObj.SomeProp
) và trong DB. Phải có cách tốt hơn ...
Đề nghị tốt! Đối số thứ hai phải là typeof (T) và không phải typeof (T) .GetType(). – Hallgrim
không may rằng mã "out T dest" không biên dịch vì nó không thể tìm thấy loại "T". Tôi sẽ nghiên cứu tùy chọn này nhiều hơn một chút ... – CodingWithSpike
@ rally25rs: T là một loại chung, trong trường hợp này những gì đang được gợi ý là bạn sử dụng Generics để xác định loại phương pháp. –