C# 在foreach语句中使用相同的方法访问多个对象

C# 在foreach语句中使用相同的方法访问多个对象,c#,object,C#,Object,我有许多不同类型的对象,都使用相同的方法。getStatus。我想访问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
。我想访问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
}

不幸的是,作为字符串的name参数没有
.getStatus
选项。有什么想法吗?甚至可能吗?

如果所有不同的对象都有相同的方法
getStatus
,那么您应该有一个包含此方法的接口
IHasGetStatus

所有对象都应使用此接口声明并实现

通过此设置,在循环中,您可以将每个对象强制转换为
IHasGetStatus
,并访问此接口的方法
getStatus
。 (使用
as
操作符,可以更平滑地处理错误)


您可以使用反射来实现这一点(在您不能/不想使用接口的情况下)

假设您有一个对象集合“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 });
    }
如果您只有类/类型名,您可能应该使用类似的名称(未测试,但应该可以使用):


您提到对象是通过WCF提供的,所以我假设您已经生成了WCF服务的代理类

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

(以防您不熟悉分部类[)

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


(以防万一你不熟悉扩展方法[)

不要为此使用
动态
。使用继承!我从这篇文章中得到了一个想法:你想按名称调用一个方法,或者你想按名称获取一个对象,然后调用.getStatus()方法?我想使用后一种方法。不幸的是,我没有选项,因为对象是通过wcf接收的。因此,请将所有约束添加到您的问题中。您对这些对象了解多少?我知道它们的类型,并且它们有一个getStatus方法。如果我可以使用
dynamic obj=name.getStatus();
但不是将前面的解释为
dynamic obj=“a”.getStatus();
将其解释为
dynamic obj=a.getStatus();
在foreach语句中使用
名称
。@George您是从wcf获得具有方法实现的对象实例吗?虽然它们包含具有不同数据的相同方法,但对象的类型不同。这是可能的?是的,因为每次使用
.getType()获取对象的真实类型时
为了找到你的GetStatus方法,然后从你的Obj(你的真实实例)调用它。所以每次它都会调用好的GetStatus和classInstance来……,我根据这个更新了我的答案。但是如果你有一个对象集合,而不仅仅是名称,第一个选项更容易使用。我不知道如何实现o对象集合。您从WCF得到什么样的结果?字符串还是差异类型实例?
 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);
}