CTO của tôi (Giám đốc kỹ thuật) yêu cầu tôi tìm ra cách để viết một hàm duy nhất trong lớp cơ sở và truy cập tất cả các thuộc tính của lớp trẻ em. Dưới đây là những gì tôi đã đưa ra -Truy cập các thuộc tính lớp con thông qua hàm trong lớp cha
Base Class
class Assets
{
public Assets getPropertyVal(Assets asObj)
{
PropertyInfo[] propInfos = asObj.GetType().GetProperties();
string strAttributeValue = "10";
foreach (PropertyInfo propInfo in propInfos)
{
// Getting the value
var propValue = propInfo.GetValue(asObj, null);
// Setting the value
propInfo.SetValue(asObj, Convert.ChangeType(strAttributeValue, propInfo.PropertyType), null);
}
return asObj;
}
}
Child Lớp
class House : Assets
{
public int rooms{get; set;}
}
Program.cs nộp
class Program
{
static void Main(string[] args)
{
House hsObj = new House();
hsObj.rooms = 5;
Assets asObj = hsObj.getPropertyVal(hsObj);
// Returns asObj as JSON
}
}
Bây giờ điều này hoạt động tốt, nhưng tôi đã chỉ tự hỏi nếu có một cách tốt hơn để làm điều này trong C#.
Lưu ý rằng chúng ta không biết những gì tính sẽ có mặt trong lớp trẻ, vì vậy đây sẽ phải được xác định tại thời gian chạy.
CẬP NHẬT: Làm cho nó rõ ràng, tôi chỉ tự hỏi nếu có một cách tốt hơn để truy cập vào các thuộc tính của lớp trẻ, một mà không sử dụng phản ánh. Điểm quan trọng cần lưu ý là chúng ta không biết các thuộc tính mà lớp con có thể có.
CẬP NHẬT # 2: Tôi đang làm việc với một sản phẩm có nhiều thực thể. Các thực thể này có các thuộc tính khác nhau. Tôi muốn có thể truy cập và làm việc với tất cả các thuộc tính này ở một nơi duy nhất. Chức năng này chính xác. Đó là một nơi duy nhất từ nơi tôi có thể truy cập tất cả dữ liệu.
Trong ví dụ của bạn, bạn tạo một đối tượng và nhận tất cả các thuộc tính của đối tượng và sau đó đặt cùng các thuộc tính trong đối tượng. Nó trông như thế này: 'var propValue = asObj.rooms; asObj.rooms = (int) propValue; '. Bạn thực sự muốn làm gì? Bạn có muốn sao chép tất cả các thuộc tính từ một lớp con sang một lớp cơ sở không? –
@VyacheslavVolkov, tôi đã tự hỏi nếu có một cách tốt hơn để truy cập vào các thuộc tính lớp con mà không sử dụng sự phản chiếu. –
Tôi không hiểu mục đích của việc này. Trong ví dụ của bạn, bạn đang mã hóa cứng tên thuộc tính con bằng 'Console.WriteLine (hsObj.rooms);'. Bạn cũng có thể loại bỏ 'hsObj = (House) hsObj.getPropertyVal (hsObj);' hoàn toàn. Sự phản chiếu hoàn toàn lãng phí. Bạn có thể đưa ra một ví dụ tốt hơn về những gì bạn đang cố gắng thực hiện không? – Dan