c#带动态类的反射

时间:2009-11-13 14:02:07

标签: c# reflection

我需要在页面中执行“FindAll”方法。此方法返回对象列表。

这是我执行“FindAll”的方法。 FindAll需要一个int并返回这些类的List。

public void ObjectSource(int inicio, object o)
{
  Type tipo = o.GetType();
  object MyObj = Activator.CreateInstance(tipo);
  object[] args = new object[1];
  args[0] = inicio;
  List<object> list = new List<object>();
  object method = tipo.InvokeMember("FindAll", BindingFlags.Default | BindingFlags.InvokeMethod, null, null, args);
}

当我执行ObjectSource时,它返回ok,但我无法访问结果。在VS2008中,我可以通过“ctrl + Alt + q”来显示列表,但是通过强制转换不起作用。

我忘了说:这个方法“FindAll”是静态的!

3 个答案:

答案 0 :(得分:1)

这里发生的事情很少,首先,你的方法不会返回结果。

其次,当你确实返回对象时,没有什么能阻止你在调用代码中转换为适当的类型。

第三,您可以使用泛型来强制键入此方法:

public T ObjectSource<T>(int inicio, T o)
{
  Type tipo = typeof(T);
  object MyObj = Activator.CreateInstance(tipo);
  object[] args = new object[1];
  args[0] = inicio;
  return tipo.InvokeMember("FindAll", BindingFlags.Default | BindingFlags.InvokeMethod, null, null, args) as T; 
}

答案 1 :(得分:1)

试试这个(更新):

public IEnumerable ObjectSource(int inicio, object o) {
    Type type = o.GetType();
    object[] args = new object[] { inicio };
    object result = type.InvokeMember("FindAll", 
        BindingFlags.Default | BindingFlags.InvokeMethod, null, o, args);
    return (IEnumerable) result;
}

更好的解决方案是将FindAll方法放入接口 - 比如IFindable,并使所有类都实现该接口。然后,您可以将对象转换为IFindable并直接调用FindAll - 无需反映。

答案 2 :(得分:0)

丹尼尔,我得到了一些对象,我需要绑定一个网格视图,这个列表超过1.000条记录,然后想要打50,这个对象源必须是通用的,因为它会调用类的FindAll! / p>