[英]Assign object to a class variable
我將字典傳遞給方法:
Dictionary<string, object> vehicles
字典的值可以是名為Vehicle
的類實例,也可以是從Vehicle
繼承的類實例,名為Truck
。
我有一個DataTable
,然后我使用字段行值來提取字典值,使用反射。
Vehicle v = (Vehicle)vehicles[dt.Rows[0]["Reference"].ToString()]
PropertyInfo vehicleInfo = typeof(Vehicle).GetProperty("Height");
string propertyVal = vehicleInfo.GetValue(t, null).ToString();
唯一的問題是,如果我嘗試從類Truck
提取字段值並且該字段不是從Vehicle
繼承的,那么vehicleInfo
不是一個對象,因為無法獲取該屬性。
有沒有辦法可以使用上面的方法動態訪問Vehicle
或Truck
類屬性? 或者是一種完全不同的方法?
理想情況下,您希望通過確保已經知道對象的類型來防止出現問題。 如果你有一個物體,你不知道它的類型,你必須檢查它是否是Truck
或Vehicle
,看看它有哪些屬性,這是要解決的根本問題。 您不希望方法獲取object
,然后嘗試弄清楚它是什么。 相反,修復它以使參數的類型有意義並告訴方法它需要知道的關於該參數的所有內容。
在不知道完整細節的情況下,您可以嘗試這樣的事情:
public interface IVehicle
{
decimal Height {get;}
}
此接口具有您期望的屬性。 您可以使用此界面編寫所有代碼。
Dictionary<string, IVehicle> vehicles
從現在開始,你永遠不會想知道它是什么或它有什么屬性。 它是一個IVehicle
,它告訴你它具有IVehicle
所有屬性。
您仍然有原始問題 - 其他未實現此接口的類。 您可以調整它們以便它們實現接口。 例如,
public class TruckToVehicleAdapter : IVehicle
{
private readonly Truck _truck;
public TruckToVehicleAdapter(Truck truck)
{
_truck = truck;
}
public decimal Height { get { return _truck.WhateverHeightPropertyThisHas; } }
}
這只是一種方法。 但一般的想法是避免讓一堆物品不知道它們的類型。 相反,想一想如何獲取你擁有的對象並要求它成為你想要的類型。 轉換它,創建一個新對象,編寫一個適配器,如上例所示。 但是你會知道你擁有什么。
如果出現另一種新類型的對象,則無需修改所有方法以查看對象是Motorcycle
還是RecreationalVehicle
。 這可能會失控。 你可以按照相同的模式。 讓一切都成為一個IVehicle
。
您可以像這樣訪問它:
if (vehicle is Truck t)
// t.FieldOfTruck
在車輛的作用甚至可以是對象
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.