Một nhiều mục đích chung, an toàn hơn, và giải pháp tái sử dụng cho vấn đề của bạn có thể thực hiện một "tham số" lớp tài sản chung chung, như thế này:
// Generic, parameterized (indexed) "property" template
public class Property<T>
{
// The internal property value
private T PropVal = default(T);
// The indexed property get/set accessor
// (Property<T>[index] = newvalue; value = Property<T>[index];)
public T this[object key]
{
get { return PropVal; } // Get the value
set { PropVal = value; } // Set the value
}
}
Sau đó, bạn có thể thực hiện bất kỳ số lượng khách sạn thuộc của bạn public class để khách hàng có thể thiết lập/lấy các thuộc tính với một chỉ số, mô tả, khóa bảo mật, hoặc bất cứ điều gì, như thế này:
public class ParameterizedProperties
{
// Parameterized properties
private Property<int> m_IntProp = new Property<int>();
private Property<string> m_StringProp = new Property<string>();
// Parameterized int property accessor for client access
// (ex: ParameterizedProperties.PublicIntProp[index])
public Property<int> PublicIntProp
{
get { return m_IntProp; }
}
// Parameterized string property accessor
// (ex: ParameterizedProperties.PublicStringProp[index])
public Property<string> PublicStringProp
{
get { return m_StringProp; }
}
}
Cuối cùng, mã khách hàng sẽ truy cập vào thuộc tính "tham số" public class của bạn như thế này:
ParameterizedProperties parmProperties = new ParameterizedProperties();
parmProperties.PublicIntProp[1] = 100;
parmProperties.PublicStringProp[1] = "whatever";
int ival = parmProperties.PublicIntProp[1];
string strVal = parmProperties.PublicStringProp[1];
Chắc chắn, điều này có vẻ kỳ lạ, nhưng nó thực sự là lừa. Bên cạnh đó, từ góc độ client-code, nó không lạ chút nào - nó đơn giản và trực quan và hoạt động giống như các thuộc tính thực. Nó không phá vỡ bất kỳ quy tắc C# nào, cũng như không tương thích với các ngôn ngữ được quản lý .NET khác. Và từ quan điểm của người triển khai lớp, việc tạo một lớp mẫu thuộc tính có thể tái sử dụng, chung chung, "được tham số hóa" làm cho thành phần mã hóa một luồng tương đối, như được hiển thị ở đây.
LƯU Ý: Bạn luôn có thể ghi đè lớp thuộc tính chung để cung cấp xử lý tùy chỉnh, chẳng hạn như tra cứu được lập chỉ mục, quyền truy cập thuộc tính được kiểm soát bảo mật hoặc bất kỳ thứ gì bạn muốn.
Chúc mừng!
Mark Jones
Người trả lời hay. Không biết tại sao bạn đề nghị sử dụng "" thay vì String.Empty mặc dù, ... bản gốc dường như rõ ràng hơn với tôi. – Stimul8d
@ Stimul8d: Tôi không theo. Làm thế nào là '" "' không rõ ràng? Sự khác biệt duy nhất mà tôi thấy giữa hai (và rằng, IMHO, một lập trình viên * nên * thấy) là 'String.Empty' dài gấp sáu lần, do đó nó chiếm không gian nhiều gấp sáu lần và mất ~ 6 lần đọc lâu hơn nó làm cho mã tồi tệ hơn gấp sáu lần. Để so sánh, điều đó giống như chúng ta sẽ sử dụng 'Int32.Zero' thay vì' 0'. –
nosed unicorn: Tôi chỉ sử dụng cùng một đối số tuần trước! –