c# - 将对象分配给类变量

标签 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使用上面的类属性?还是需要一种完全不同的方法?

最佳答案

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

在不知道全部细节的情况下,你可以尝试这样的事情:

public interface IVehicle
{
    decimal Height {get;}
}

此接口(interface)具有您期望的属性。您使用此界面编写所有代码。

Dictionary<string, IVehicle> vehicles

从现在开始,您再也不必怀疑某物是什么或它具有哪些属性。它是一个 IVehicle,告诉您它具有 IVehicle 的所有属性。

您仍然遇到最初的问题 - 其他未实现此接口(interface)的类。然后您可以进行调整,以便他们实现接口(interface)。例如,

public class TruckToVehicleAdapter : IVehicle
{
    private readonly Truck _truck;

    public TruckToVehicleAdapter(Truck truck)
    {
        _truck = truck;
    }

    public decimal Height { get { return _truck.WhateverHeightPropertyThisHas; } }
}

这只是一种方法。但一般的想法是避免有一堆你不知道它们类型的对象。相反,想想如何获取您拥有的对象并要求它成为您想要的类型。转换它,创建一个新对象,像上面的例子一样编写一个适配器。但是你会知道你有什么。

如果出现另一种新类型的对象,您不必修改所有方法来查看您的对象是Motorcycle 还是RecreationalVehicle。那可能会失控。您可以遵循相同的模式。让一切成为IVehicle

关于c# - 将对象分配给类变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45219323/

相关文章:

c# - 在 Linq 中使用 Expression<Func<T,X>> 包含扩展

c# - 使用 LINQ 查询获取索引值的集合

c# - 如何设置下拉列表DataTextField显示两个数据属性字段?

c# - 当我打开 STEAM 时,乒乓球游戏运行得更快 - 为什么?

c# - MVC 上的依赖注入(inject)问题

c# - 如何将新属性添加到 C# 列表中的每个列表项

c# - 如何调试 .NET 中的 System.TypeLoadException 错误?

c# - 在分组列表框 View 中拉伸(stretch)标题宽度

c# - 搭建controller vs2015时报错Key Already Exists in Table

c# - 在 C# 中为 Windows Mobile App 创建一个文本文件