2017-11-21 63 views
5

Đây là trong dự án .NET Core 1.1.4, vì vậy hãy xem xét điều này.Truyền một `Nullable <T>` làm tham số Kiểu cho hàm C#

Tôi đang cố tạo một hàm xác minh xem giá trị có thể được gán cho loại không, nhưng tôi đang gặp sự cố với các loại Nullable<T>.

chức năng của tôi:

protected void CheckIsAssignable(Object value, Type destinationType) 
    { 
     if (value == null) 
     { 
      // Nullable.GetUnderlyingType returns null for non-nullable types. 
      if (Nullable.GetUnderlyingType(destinationType) == null) 
      { 
       var message = 
        String.Format(
         "Property Type mismatch. Tried to assign null to type {0}", 
         destinationType.FullName 
        ); 
       throw new TargetException(message); 
      } 
     } 
     else 
     { 
      // If destinationType is nullable, we want to determine if 
      // the underlying type can store the value. 
      if (Nullable.GetUnderlyingType(destinationType) != null) 
      { 
       // Remove the Nullable<T> wrapper 
       destinationType = Nullable.GetUnderlyingType(destinationType); 
      } 
      // We can now verify assignability with a non-null value. 
      if (!destinationType.GetTypeInfo().IsAssignableFrom(value.GetType())) 
      { 
       var message = 
        String.Format(
         "Tried to assign {0} of type {1} to type {2}", 
         value, 
         value.GetType().FullName, 
         destinationType.FullName 
        ); 
       throw new TargetException(message); 
      } 
     } 
    } 

Mệnh if trên xử lý các trường hợp nếu valuenull, và cố gắng để xác minh rằng destinationTypeNullable<T>; mệnh đề else xử lý nếu value thực sự chứa thứ gì đó, do đó, nó cố gắng xác định xem bạn có thể gán nó cho destinationType hoặc, nếu đó là Nullable<T>, có thể gán cho T.

Sự cố là Nullable<T> không phải là Type, do đó, hãy gọi CheckIfAssignable(3, Nullable<Int32>) không khớp với chữ ký chức năng.

Thay đổi chữ ký:

protected void CheckIsAssignable(Object value, ValueType destinationType) 

cho phép tôi vượt qua một Nullable<T>, nhưng sau đó tôi không thể gửi nó như một cuộc tranh cãi để Nullable.GetUnderlyingType.

Tôi không chắc liệu mình đã quá phức tạp vấn đề với điều này chưa, nhưng tôi cảm thấy có một giải pháp đơn giản mà tôi không thấy.

+5

'Nullable ' là loại, giống như bất kỳ loại nào khác. Sử dụng 'typeof()', giống như bất kỳ loại nào khác. – SLaks

Trả lời

6

Bạn không tự đi qua chính loại đó. Bạn cần sử dụng lệnh typeof() như sau:

CheckIfAssignable(3, typeof(Nullable<Int32>)) 
Các vấn đề liên quan