2008-11-07 36 views
60

Tôi có một lớp lưu trữ một giá trị được tuần tự hóa và một loại. Tôi muốn có thuộc tính/phương thức trả lại giá trị đã được đúc:Tạo một thuộc tính chung

public String Value { get; set; } 

public Type TheType { get; set; } 

public typeof(TheType) CastedValue { get { return Convert.ChangeType(Value, typeof(_Type)); } 

Điều này có thể thực hiện được trong C# không?

+4

Tính chất chung sẽ tốt đẹp; Tôi nghĩ 'var val = obj.Prop ' gọn gàng hơn đối với tra cứu dựa trên kiểu so với 'obj.Prop [typeof (Type)]' hoặc 'obj.GetProp ()'. – Dan

Trả lời

93

Có thể nếu lớp có chứa tài sản là chung chung, và bạn khai báo tài sản bằng cách sử dụng các tham số chung:

class Foo<TValue> { 
    public string Value { get; set; } 
    public TValue TypedValue { 
     get { 
      return (TValue)Convert.ChangeType(Value, typeof(TValue)); 
     } 
    } 
} 

Một thay thế sẽ được sử dụng một phương pháp chung chung thay vì:

class Foo { 
    public string Value { get; set; } 
    public Type TheType { get; set; } 

    public T CastValue<T>() { 
     return (T)Convert.ChangeType(Value, typeof(T)); 
    } 
} 

Bạn cũng có thể sử dụng các lớp học System.ComponentModel.TypeConverter để chuyển đổi, vì chúng cho phép một lớp xác định trình chuyển đổi riêng của nó.

Sửa: lưu ý rằng khi gọi phương thức chung chung, bạn phải xác định các tham số kiểu chung chung, vì trình biên dịch không có cách nào để suy ra nó:

Foo foo = new Foo(); 
foo.Value = "100"; 
foo.Type = typeof(int); 

int c = foo.CastValue<int>(); 

Bạn cần phải biết loại tại thời gian biên dịch . Nếu bạn không biết loại tại thời gian biên dịch sau đó bạn phải lưu trữ nó trong một object, trong trường hợp này bạn có thể thêm thuộc tính sau vào lớp Foo:

public object ConvertedValue { 
    get { 
     return Convert.ChangeType(Value, Type); 
    } 
} 
+0

Trong ví dụ thứ hai của lớp 'Foo, tôi bị bối rối: thuộc tính công khai' theType được khai báo: "public Type TheType {get; set;}" nhưng dường như không được sử dụng trong mã. cảm ơn, – BillW

+0

Thuộc tính nằm trong ví dụ ban đầu. Tôi chỉ để lại nó trong. – Brannon

+0

Khi tôi thử giải pháp Brannons tôi nhận được một lỗi thời gian chạy nói rằng đối tượng tôi đang đúc phải thực hiện IConvertible. Tôi đã làm điều gì đó sai bởi vì điều này có vẻ giống như một máy cắt giao dịch trừ khi đúc một lớp mà tôi có nguồn sẵn có. – Keith

3

Tôi không tin ví dụ bạn đã đưa ra ở đây là có thể. Loại CastedValue phải được xác định tại thời gian biên dịch, có nghĩa là nó không thể phụ thuộc vào giá trị thời gian chạy (giá trị của thuộc tính TheType).

EDIT: Giải pháp của Brannon có một số ý tưởng hay về cách xử lý việc này bằng cách sử dụng hàm chung hơn là thuộc tính.

52

Thuộc tính, sự kiện, nhà thầu vv không thể là chung chung - chỉ có các phương pháp và loại có thể là chung chung. Hầu hết thời gian đó không phải là vấn đề, nhưng tôi đồng ý rằng đôi khi đó là một nỗi đau. Câu trả lời của Brannon đưa ra hai cách giải quyết hợp lý.

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