【问题标题】:C# How to cast object to ICollection of objectsC#如何将对象转换为对象的ICollection
【发布时间】:2021-04-09 10:02:14
【问题描述】:

我有一个使用这种语法从反射中得到的变量(property 是一个字符串):

            T entity = DbContext.Set<T>()
               .Include(property)
               .FirstOrDefault(x => x.Id == key);
            var navPropertyCollection = Properties
               .FirstOrDefault(p => p.Name == property)
              ?.GetValue(entity);

navPropertyCollection 是一个对象,但在一个类中它被声明为ICollection&lt;MyClass&gt; 并初始化为List&lt;MyClass&gt;。这是有效的:

            var navPropertyCollection = Properties
               .FirstOrDefault(p => p.Name == property)
              ?.GetValue(entity) as List<MyClass>;

但我不知道 MyClass(而且根本不需要这个方法)!我只知道它是 MyBaseClass 的孩子。 我需要将它转换成ICollection&lt;dynamic&gt;ICollection&lt;object&gt;ICollection&lt;MyBaseClass&gt;List&lt;dynamic&gt;List&lt;object&gt;List&lt;MyBaseClass&gt; 之类的东西。但是这些演员表不起作用。 转换为IEnumerable&lt;object&gt;IEnumerable&lt;MyBaseClass&gt; 有效,但这不是选项,因为稍后我需要调用方法Add(),并且我的DbContext 中没有标记更改。

【问题讨论】:

  • 您确定转换为非泛型 IList 不起作用吗?我希望这能奏效,并允许您稍后致电Add
  • @JonSkeet 我忘记了非泛型 IList。请作答。非常感谢!

标签: c# collections casting entity-framework-core .net-5


【解决方案1】:

如果您确定该属性的值将是 List&lt;T&gt; 或其他实现非泛型 IList 接口的泛型集合,我建议转换为该值。 (不过,我会强制转换而不是使用 as,以避免掩盖意外的类型。)

所以:

var navPropertyCollection = (IList) Properties
    .FirstOrDefault(p => p.Name == property)
    ?.GetValue(entity);

【讨论】:

    猜你喜欢
    • 2011-05-26
    • 1970-01-01
    • 2022-01-24
    • 2016-04-24
    • 1970-01-01
    • 2011-01-23
    • 2022-01-23
    • 2014-07-07
    • 1970-01-01
    相关资源
    最近更新 更多