【问题标题】:Check dynamic object type by string comparison通过字符串比较检查动态对象类型
【发布时间】:2023-03-16 07:02:01
【问题描述】:

如果是某种类型的基础对象,检查基础对象的最佳方法是什么,myObject 可以在“n”级别具有层次结构,我想与字符串进行比较,因为 myObject 是动态的并且我没有对车辆的装配访问权限

a) 汽车:车辆
b) 自行车:双轮车:车辆
c) 卡车:拖车:FourWheeler:车辆

dynamic myObject = someObject;
if(myObject is Vehicle)  // Works
if(myObject is "Vehicle") //How to ?

【问题讨论】:

    标签: c# c#-4.0 dynamic


    【解决方案1】:

    你可以使用 IsAssginableFrom

    System.Type.GetType(typeNameAsString).IsAssignableFrom(myObject.GetType())
    

    测试是否可以将 myObject 分配给由 typeNameAsString 中保存的名称(字符串)标识的类型的存储位置。

    这仅适用于实际加载的类型,您应该使用完全限定名称。

    【讨论】:

    • 我在“System.Type.GetType(typeNameAsString)”中得到 NullReferenceError,因为没有添加“Vehicle”组件。
    • @BrazilNut 似乎您了解此代码无法按原样运行的原因。为什么不自己修呢?
    • @BrazilNut 更有可能是因为没有使用完全限定的名称,即 namespace.type。
    • @Rune:我确实使用了完整的命名空间,试图找到其他方式
    • @RuneFS:如果您不指定程序集,它会检查 mscorlib 和当前正在执行的程序集......但不检查其他程序集。
    【解决方案2】:

    写了一点递归的方法来解决:

     private bool IsVehicle(Type type)
            {
                if (type.BaseType != null)
                    if (type.BaseType.FullName == "Vehicle")
                        return true;
                    else
                        return IsVehicle(type.BaseType);
                return false;
            }
    

    【讨论】:

    • 这个方法有错误。应该是else return IsVehicle...
    • 我认为如果你传入“车辆”类型它也会失败。
    猜你喜欢
    • 2013-09-02
    • 2017-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-16
    • 2018-05-06
    相关资源
    最近更新 更多