【问题标题】:How to unbox a box to an ICollection with an unknown type?如何将一个盒子拆箱到一个未知类型的 ICollection?
【发布时间】:2012-03-31 12:43:54
【问题描述】:

我有一个可以容纳对象的 IRecord 对象。这些对象的名称作为属性保存在映射中。我遍历属性并通过执行

将它们从 IRecord 中取出
record[property]

这些对象始终是 ICollections。但是,我不知道 ICollection 将持有什么类型。如何在不知道 ICollection 将保存什么的情况下将对象拆箱到正确的 ICollection?

如果record[property 是ICollection,则下面的代码是一个工作版本,所以我想将其更改为可以采用任何ICollection。

public ElectronicSignatureModel SignHierarchy(IRecord record, List<HierarchyMapping> mapping)
    {
        foreach (HierarchyMapping hierarchyMapping in mapping)
        {

            string[] propertyList = hierarchyMapping.Properties;
            foreach (string property in propertyList)
            {
                ICollection<Sample> recordProperty = (ICollection<Sample>)record[property];
            }
        }

【问题讨论】:

    标签: c# unboxing icollection


    【解决方案1】:

    您可以使用 .NET 反射在运行时动态获取对象中的属性值。甚至您可以使用它来调用方法或创建类实例。

    你可以试试下面的代码:

    foreach (string property in propertyList)
    {
        PropertyInfo pinfo = record.GetType().GetProperty(property);
        var recordProperty = pinfo.GetValue(record, null);
    }
    

    recordProperty”现在应该有正确的 ICollection,然后你就可以使用它了。

    您可以在此处阅读有关 .NET 反射的更多信息:

    .NET 中的反射 http://www.codeproject.com/Articles/55710/Reflection-in-NET

    .NET 框架中的反射 http://msdn.microsoft.com/en-us/library/f7ykdhsy(v=vs.100).aspx

    【讨论】:

    • 然后当我执行 foreach (var recordProperty in ICollection) 时,它说 System.Collections.Generic.ICollection 是一种类型,但用作变量
    • 我认为你应该这样做: foreach (var item in recordProperty as System.Collections.IEnumerable) { // 现在你可以在这里使用“item”变量 // 但你应该知道哪个您需要使用的属性或项目集合的基本类型}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    • 2016-05-21
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    相关资源
    最近更新 更多