2015-04-02 80 views
0

我有许多不同类型的对象都使用相同的方法.getStatus。我想在foreach语句中访问所有对象的方法。例如:在foreach语句中使用相同的方法访问许多对象

String[] names = new String[] {"a", "b", "c"}; 
foreach (string name in names) { 
    dynamic obj = name.getStatus(); //instead of a.getStatus(); 
    //Do 
    //some 
    //stuff 
    //here 
} 

不幸的是,名称参数是一个字符串没有一个.getStatus选项。有任何想法吗?它甚至有可能吗?

+1

不使用'dynamic'for这一点。使用继承! – DrKoch 2015-04-02 09:18:00

+0

我从这篇文章的想法http://stackoverflow.com/questions/29406856/shapeless-objects-in-c-sharp – Ctrlfreak 2015-04-02 09:20:14

+0

你想通过它的名称调用一个方法,或者你想通过它的名称获得一个对象,然后从它调用.getStatus()方法? – 2015-04-02 09:25:13

回答

1

如果您的所有不同的对象具有相同的方法getStatus那么你应该有一个接口IHasGetStatus其中包含此方法。

所有的对象都应该声明并实现这个接口。

使用此设置,在循环中,您可以将每个对象投射到IHasGetStatus并访问该界面的方法getStatus。 (随着as运营商你有流畅的错误处理)

foreach(object o in myObjects) 
{ 
    IHasGetStatus ihgs = o as IHasGetStatus; 
    if(ihgs == null) // error: o has not the required interface 
    var status = ihgs.getStatus(); 
} 
+0

不幸的是,我没有选择,因为通过wcf接收对象。 – Ctrlfreak 2015-04-02 09:24:27

+1

因此,请在所有问题中添加所有约束。你知道这些对象是什么? – DrKoch 2015-04-02 09:33:20

+0

我知道他们的类型,并且他们有一个getStatus方法。如果我可以使用'dynamic obj = name.getStatus();'而不是将前一个解释为'dynamic obj ='a .getStatus();'将其解释为'dynamic obj = a,那将是理想的。 getStatus();'在foreach语句中使用'name'。 – Ctrlfreak 2015-04-02 09:37:36

0

您可以使用反射来实现这一点(的情况下,你不能/不想使用的界面)

假设你有对象集合“myObjects”不仅名字

foreach(object Obj in myObjects) 
    { 
    //depending on the visibility of your method you may need Bindings flags 
    MethodInfo dynMethod = Obj.GetType().GetMethod("getStatus"); 
    var status = (string)dynMethod.Invoke(Obj, null); 
    //with parameters => dynMethod.Invoke(this, new object[] { methodParams }); 
    } 
在你不得不类/类型名你应该使用类似这样的情况下

(未经测试,但应工作):

String[] names = new String[] {"a", "b", "c"}; 
foreach (string name in names) { 

    Assembly assembly = Assembly.LoadFile("...Assembly.dll"); 
    Type type = assembly.GetType(name);//name should be the full type name (Namespace.ClassName) 
    //here you get your Object instance 
    object Obj= Activator.CreateInstance(type, null); 
    MethodInfo dynMethod= Obj.GetType().GetMethod("getStatus"); 
    var status = (string)dynMethod.Invoke(Obj, null); 
} 
+0

它的对象是不同类型的,尽管它们包含了不同数据的相同方法。有可能的? – Ctrlfreak 2015-04-02 10:10:30

+0

是的,这是因为每次使用'.getType()'获得对象的实际类型以便找到您的_GetStatus_方法,然后从您的Obj(实际实例)中调用它。所以每次它会调用好_GetStatus_ – 2015-04-02 10:20:21

+0

嘿感谢您的更新,你混合'dynMethod'与'Obj' – Ctrlfreak 2015-04-02 10:20:40

1

您提到对象是通过WCF馈送的,所以我假设您拥有生成的WCF服务的代理类。

默认情况下,WCF服务的所有代理类都生成为partial,因此,一旦通过在另一个文件中实现接口来生成它们,您的确可以实现这些类的接口。您必须使用任意方法来实现每种类型,然后调用该类型的GetStatus(),但在您的foreach循环中,您可以使用@DrKoch的解决方案。

(以防万一你不熟悉的部分类[https://msdn.microsoft.com/en-us/library/wa80x488.aspx]

如果不为你工作,出于某种原因,你可以通过使用扩展方法,实现以类似的方式相同的结果,其允许您将方法“添加”到非静态密封类。再次,您必须为每种类型单独执行此操作,并且再次假定您事先知道类型并可以访问它们,例如,通过引用程序集或WCF代理类。

(以防万一你不熟悉的扩展方法[https://msdn.microsoft.com/en-us/library/bb383977.aspx]