我有一个词典:
Dictionary<int, Type> AllDrillTypes = new Dictionary<int, Type>()
{
  {13,typeof(TCHEMISTRY)},
  {14,typeof(TDRILLSPAN)}
};
其中TCHEMISTRY和TDRILLSPAN是类.然后我想从这些类中获取行,如下所示:
Type T = AllDrillTypes[13];
var LC = Activator.CreateInstance( typeof(List<>).MakeGenericType( T ) );
MethodInfo M = T.GetMethod("FindAll", BindingFlags.Public | BindingFlags.Static, null, new Type[] { }, null);    
LC = M.Invoke(null, new object[] { });
所有这些代码都正常工作.之后我需要得到一些这样的行:
var LingLC = from obj in LC where obj.RunID == 1001 select obj;
但是这一行会导致错误:
"找不到源类型'对象'的查询模式的实现.'找不到的地方."
这段代码有什么问题?
即使您无法更改类定义,也可以避免使用反射:
// Getter dictionary rather than type dictionary.
Dictionary<int, Func<IEnumerable<object>>> DrillTypeGetters =
    new Dictionary<int, Func<IEnumerable<object>>>()   
    {  
        { 13, () => TCHEMISTRY.FindAll().Cast<object>() },
        { 14, () => TDRILLSPAN.FindAll().Cast<object>() }
    };
Dictionary<int, Func<object, int>> IDGetters =
    new Dictionary<int, Func<object, int>>()
    {
        { 13, o => ((TCHEMISTRY)o).RunID },
        { 14, o => ((TDRILLSPAN)o).RunID }
    };
IEnumerable<object> LC = DrillTypeGetters[13]();
IEnumerable<object> LingLC = 
    from obj in LC
    where IDGetters[13](obj) == 1001
    select obj;
或者您甚至可以打开13/14并为每种类型运行完全不同的方法。
if (choice == 13)
    IEnumerable<TCHEMISTRY> LingLC =
        TCHEMISTRY.FindAll().Where(tc => tc.RunID == 1001);
else if (choice == 14)
    IEnumerable<TDRILLSPAN> LingLC =
        TDRILLSPAN.FindAll().Where(td => td.RunID == 1001);
基本上,如果这两个类不共享任何公共层次结构,您就无法编写任何公共代码来处理它们。如果它们有很多相似的属性,您可以像我的第一个示例一样使用 getters 来提供一种获取相似属性的方法,无论您正在处理的类类型如何。如果它们甚至没有相似的属性,就不要尝试编写共享代码。