将对象分配给类变量

时间:2017-07-20 15:38:04

标签: c#

我将字典传递给方法:

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类属性?或者是一种完全不同的方法?

2 个答案:

答案 0 :(得分:2)

理想情况下,您希望通过确保您已经知道对象的类型来防止此问题。如果你有一个对象,你就不知道它的类型,你必须检查它以查看它是Truck还是Vehicle并查看它有哪些属性,即& #39; s要解决的根本问题。你不想要一种方法来获取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

答案 1 :(得分:1)

你可以像这样访问它:

if (vehicle is Truck t)
     // t.FieldOfTruck

在车辆的角色中甚至可以是对象