2013-07-24 38 views
7

Có cách nào với C# generics để giới hạn một loại T có thể được chuyển từ loại khác?Ràng buộc chung C# cho Loại có thể được cast

Ví dụ:
phép nói rằng tôi đang lưu thông tin trong registry như một string, và khi tôi khôi phục thông tin mà tôi muốn có một chức năng mà trông giống như thế:

static T GetObjectFromRegistry<T>(string regPath) where T castable from string 
{ 
    string regValue = //Getting the regisstry value... 
    T objectValue = (T)regValue; 
    return objectValue ; 
} 
+1

Không có hạn chế như vậy trong .NET –

Trả lời

4

Không có loại như vậy của những hạn chế trong .NET. Chỉ có sáu loại chế sẵn (xem Constraints on Type Parameters):

  • where T: struct kiểu lập luận phải là một kiểu giá trị
  • where T: class kiểu lập luận phải là một loại tài liệu tham khảo
  • where T: new() kiểu lập luận phải có một constructor parameterless công cộng
  • where T: <base class name> đối số loại phải là hoặc lấy được từ lớp cơ sở được chỉ định
  • where T: <interface name> đối số loại phải là hoặc triển khai interfa được chỉ định ce
  • where T: U kiểu lập luận cung cấp cho T phải hoặc xuất phát từ lập luận cung cấp cho U

Nếu bạn muốn cast xâu thành kiểu của bạn, bạn có thể làm đúc để phản đối đầu tiên. Nhưng bạn không thể đặt hạn chế về số loại để đảm bảo đúc này có thể xảy ra:

static T GetObjectFromRegistry<T>(string regPath) 
{ 
    string regValue = //Getting the regisstry value... 
    T objectValue = (T)(object)regValue; 
    return objectValue ; 
} 

Một lựa chọn khác - tạo giao diện:

public interface IInitializable 
{ 
    void InitFrom(string s); 
} 

Và đặt nó như là hạn chế:

static T GetObjectFromRegistry<T>(string regPath) 
    where T: IInitializable, new() 
{ 
    string regValue = //Getting the regisstry value... 
    T objectValue = new T(); 
    objectValue.InitFrom(regValue); 
    return objectValue ; 
} 
0

loại được xác định trong quá trình biên dịch. Bạn không thể thay đổi các loại trong thời gian chạy. Có thể đúc tượng để cơ sở hoặc con các lớp học

Ref -

Difference between object a = new Dog() vs Dog a = new Dog()

+0

Tôi nhận ra rằng loại được xác định tại thời gian biên dịch. nhưng tại thời gian biên dịch, bạn cũng có thể tham chiếu kiểu được truyền cho hàm. (theo cách tương tự. string a = "abc", [0] sẽ hoạt động khi (một đối tượng) [0] sẽ không) Vì vậy, tôi không thực sự thấy cách này trả lời câu hỏi ... –

0

Ràng buộc đánh vần như "loại T phải là kiểu U hoặc kiểu thừa kế U", do đó ràng buộc bạn đang tìm kiếm không thể thực hiện được.

mọi thứ là "cast" để String dù sao, qua .ToString() (YMMV)

+0

* * YMMV giải thích: ** '.ToString()' là một hoặc nhiều tính năng gỡ lỗi sẵn có. "[Nó chuyển đổi một đối tượng thành biểu diễn chuỗi của nó sao cho nó phù hợp để hiển thị.] (Https://msdn.microsoft.com/en-us/library/system.object.tostring.aspX)" - MSDN. Tôi khuyên bạn nên chống lại (ab-) sử dụng nó để đúc. – FooBarTheLittle

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