【问题标题】:Cast an object to IEnumerable<T> where I know what T is将对象投射到 IEnumerable<T> 我知道 T 是什么的地方
【发布时间】:2014-05-05 13:39:11
【问题描述】:

我有一个包含 IEnumerable 的对象,其中 T 可以位于我的数据模型中的几个类中。

假设 T 可以是 Employee 或 Employer。现在有一个裸对象,知道它肯定持有一个 IEnumerable 我怎么能说它持有哪个类型?雇员还是雇主?或者更好的方法是如何将对象投射或反射到 IEnumerable?

如果我在设置对象时保持类型,它会帮助我将对象投射或反映到最初的样子吗?

如果我保留这些

object source = db.Employees; //IEnumerable<Employee>
type dataType = Employee;

我可以投射或反射回 IEnumerable 的员工吗?

【问题讨论】:

标签: c# .net linq reflection


【解决方案1】:

一般情况下你可以使用反射

Type typeOfSource = source.GetType().GetGenericArguments()[0];

if (typeOfSource == typeof(Employee)) {
  ...
}
else if (typeOfSource == typeof(Employer)) {
  ...
}

这是一个 overshoot 在一个简单的情况下只有两种类型,但如果你有一个真正纠缠的代码,它可能是有用 .

【讨论】:

  • 感谢 Dmitry,但我有几种类型,我不能提及它们,因为我希望代码能够动态运行。
【解决方案2】:

t你可以试试as操作符

var otherEmployess = source as IEnumerable<Employee>;

if(otherEmployess != null)
{
        // use otherEmployees
}

您也可以选择IEnumerable&lt;Employee&gt;,但如果类型不是IEnumerable&lt;Employee&gt;,则会引发异常

【讨论】:

  • 我想db.Employees 永远是IEnumerable&lt;Employee&gt;,那么为什么要使用安全演员表呢?我认为 OP 可能只是不知道如何进行演员阵容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-12
  • 2020-04-20
  • 2013-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多