【问题标题】:is there a way to dynamically assign type to a generic linq expression?有没有办法将类型动态分配给通用 linq 表达式?
【发布时间】:2019-02-08 04:30:56
【问题描述】:

当子类型仅在运行时已知时,有没有办法从特定子类型的集合中获取对象?类似:

class A
{}

class B : A
{}

class C : A
{}

Main()
{ 
  List<A> outsideList = new List<A>() {new A(), new B(), new C()};

     foreach(var ojb in outsideList)
     {
       dosomethingwithanobject(ojb);
     }
}

void dosomethingwithanobject(A obj)
{
     List<A> intenalList = new List<A>() { new C(), new A(), new B()};
   // this can be A, B or C
   type DESIREDTYPE = typeof(obj);

  var item = list.GetSubType<DESIREDTYPE>().FirstOrDefault();

      // do something with the item
}

【问题讨论】:

标签: linq generics reflection


【解决方案1】:

我认为您可以使用以下代码:

var result = intenalList.Where(x => x.GetType() == obj.GetType()).FirstOrDefault();

【讨论】:

  • 嗯,谢谢你 kapd,这看起来像我要找的。简单明了。
【解决方案2】:

LINQ 有两个操作用于将一系列未知(或父)类型转换为子类型:CastOfType

Cast 将类型转换应用于每个元素,如果无效则失败。 OfType 只返回可以转换为新类型的元素。

所以,

var item = list.OfType<DESIREDTYPE>().FirstOrDefault();

【讨论】:

  • 感谢 NetMage,这确实非常有用,我经常使用它,但是这种情况意味着 DESIREDTYPE 在编译时是已知的(即它希望将实际的类名放在括号中)其中因为我的情况是只有在运行类型时才能知道实际类型(可能从传递的类型名称或对象的字符串中推断出来)。
  • 对不起,我没有注意到(全大写的变量名让我失望:))。 @kapd 的答案在这种情况下似乎是最好的(尽管我会使用你想要的类型变量)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-10
  • 2015-04-04
  • 2012-04-24
  • 1970-01-01
  • 2014-08-25
  • 2016-07-20
  • 2023-01-01
相关资源
最近更新 更多