簡體   English   中英

將對象分配給類變量

[英]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不是一個對象,因為無法獲取該屬性。

有沒有辦法可以使用上面的方法動態訪問VehicleTruck類屬性? 或者是一種完全不同的方法?

理想情況下,您希望通過確保已經知道對象的類型來防止出現問題。 如果你有一個物體,你不知道它的類型,你必須檢查它是否是TruckVehicle ,看看它有哪些屬性,這是要解決的根本問題。 您不希望方法獲取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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM