2009-11-13 94 views
0

我需要在页面中执行一个“FindAll”方法。此方法返回该对象的列表。动态类的c#反射

这是我执行“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”是静态的!

+2

为什么你要创建一个新类型的实例,你为什么要创建一个'List '而不使用它,为什么你会有效地忽略该方法的返回值? – 2009-11-13 14:16:18

+0

并且:为什么要创建一个通用列表并在其中粘贴一个对象? – 2009-11-13 14:22:17

+0

你为什么要创建一个新的类型实例?它没有使用,我删除。 你为什么要创建一个列表而不使用它?只用于teste .. FindAll方法返回一个IEnumerable,但我使用的是作为Wim Hollebrandse发布的genterics。 为什么你有效地忽略了方法的返回值?我需要这些方法的结果,我不知道如何得到它! – ChepA 2009-11-13 19:52:34

回答

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; 
}
+0

嗨... 1)此方法不必返回任何结果。那是对的。 2)FindAll方法返回IEnumarable并使用yeld语句。 – ChepA 2009-11-13 19:53:09

+0

@ChepA:如果'FindAll'方法返回一个'IEnumerable'(不管是否使用yield,这都没有关系),那么如果没有返回,那么你如何期望得到那个'IEnumerable' 'ObjectSource'方法? – 2009-11-13 19:56:31

+0

另外,正如Jon Skeet在他对这个问题的评论中指出的那样,创建一个新的对象实例在这里可能是错误的。你不想在'o'对象上调用'FindAll'吗? – 2009-11-13 19:57:52

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 - 无需反射。

+0

对于界面建议+1,我怀疑这是一个好得多的解决方案 – Pharabus 2009-11-13 20:20:22

+0

好主意,但总是当我投出结果时,返回null。 – ChepA 2009-11-13 20:21:02

+0

当我执行对象result = o.InvokeMember(“FindAll”, BindingFlags.Default | BindingFlags.InvokeMethod,null,null,args);返回类型是{FrameWork.Patrimonio.Bem.FindAll}。 – ChepA 2009-11-13 20:25:28

0

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

+0

当我说这是一个单独的**问题**时,我的意思是,单击页面顶部的“问题问题”链接,并提出一个全新的问题。你在这里发布的是针对你自己的问题的**答案,实际上只是提出了一个新问题。请记住,StackOverflow不是一个通用的论坛,它是一个问答网站。 – 2009-11-17 17:07:22

+0

LoL ...但我做了我的反思工作!我非常感谢帮助。 – ChepA 2009-11-18 12:22:34