C# 将对象赋值给类变量

C# 将对象赋值给类变量,c#,C#,我将字典传递给一个方法: 字典车辆 字典的值可以是名为Vehicle的类实例,也可以是从Vehicle继承的名为Truck的类实例 我有一个DataTable,然后我使用一个字段行值来提取字典值,使用反射 Vehicle v = (Vehicle)vehicles[dt.Rows[0]["Reference"].ToString()] PropertyInfo vehicleInfo = typeof(Vehicle).GetProperty("Height"); string propert

我将字典传递给一个方法:

字典车辆

字典的值可以是名为
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
就不是对象,因为无法获取属性


是否有一种方法可以使用上述工具动态访问
车辆
卡车
类别属性?或者需要完全不同的方法吗?

您可以这样访问它:

if (vehicle is Truck t)
     // t.FieldOfTruck
public interface IVehicle
{
    decimal Height {get;}
}

车辆的角色甚至可以是物体

理想情况下,您希望通过确保您已经知道物体的类型来防止问题。如果你有一个对象,你不知道它的类型,你必须检查它,看看它是
卡车
还是
车辆
,看看它有哪些属性,这就是要解决的根本问题。您不希望方法获取
对象
,然后尝试找出它是什么。相反,修复它,使参数的类型有意义,并告诉方法它需要知道的关于该参数的一切

在不了解全部细节的情况下,您可以尝试以下方法:

if (vehicle is Truck t)
     // t.FieldOfTruck
public interface IVehicle
{
    decimal Height {get;}
}
此接口具有您期望的属性。您可以使用此接口编写所有代码

Dictionary<string, IVehicle> vehicles
这只是一种方法。但是一般的想法是避免有一堆你不知道其类型的对象。相反,考虑如何获取您拥有的对象,并要求它成为您想要的类型。转换它,创建一个新对象,编写一个适配器,如上面的示例所示。但你会知道你拥有什么


如果出现了另一种新类型的对象,您不必修改所有方法来查看您的对象是
摩托车
还是
休闲车
。这可能会失控。你可以遵循同样的模式。将所有内容都设置为
i车辆

您能否解释一下为什么要使用反射来访问
车辆
的属性?问题实际上是如何确定您想要获得的属性?这意味着所有这些类型的知识,这在这种半断开连接的访问方式中是很奇怪的。这里可能有X/Y问题。无论你想完成什么,用不同的方法很可能会更好。仅限于此,您可以使用新的或旧的
var xy=x作为Y;如果(x!=null).
BS。。。