C# 将对象传递到方法而不向方法添加参数?

C# 将对象传递到方法而不向方法添加参数?,c#,methods,C#,Methods,我有一个名为IEvent的简单接口,它只包含一个方法: void Execute(); 我有几个来自这个接口的派生类,其中一个需要访问方法调用方拥有的对象。对象的使用方式如下: using (MyObject object = new MyObject(this.MessageService) { foreach (IEvent myEvent in eventList) { myEvent.Execute(); // <--- I need to pas

我有一个名为IEvent的简单接口,它只包含一个方法:

void Execute();
我有几个来自这个接口的派生类,其中一个需要访问方法调用方拥有的对象。对象的使用方式如下:

using (MyObject object = new MyObject(this.MessageService)
{
    foreach (IEvent myEvent in eventList)
    {
        myEvent.Execute(); // <--- I need to pass object without adding argument here if possible?
    }
}
使用(MyObject对象=新的MyObject(this.MessageService)
{
foreach(事件列表中的IEvent myEvent)
{
myEvent.Execute();//我将使用.NET、CLR、IL以及围绕这些主题的所有内容。您无法访问调用对象的实例,尤其是调用方法中的本地变量。例如,您可以获取其类型,您可以通过
StackTrace
获取调用方法(
StackTrace.GetFrames()
),但在这种情况下,这些都不会对您有任何好处。您要完成的工作需要深入调试API。关于遍历堆栈,这里是我创建的一个快速示例,以尝试看看是否可以为您找到一些解决方法(我对你的课程结构做了假设……很明显,这不是一对一的样本):

使用系统;
使用System.Collections.Generic;
使用系统诊断;
名称空间SampleApp
{
班级计划
{
静态void Main(字符串[]参数)
{
var eventList=新列表{new SomeClass()};
使用(MyObject obj=newmyobject(newmessageservice()))
{
foreach(事件列表中的IEvent myEvent)
{
myEvent.Execute();
}
}
}
}
公共接口事件
{
void Execute();
}
公共类SomeClass:IEvent
{
public void Execute()
{
var stackTrace=新的stackTrace();
var stackFrames=stackTrace.GetFrames();
var callingMethod=stackFrames[1].GetMethod();
var callingType=callingMethod.DeclaringType;
}
}
公共类MyObject:IDisposable
{
公共消息服务{get;}
公共MyObject(消息服务)
{
服务=服务;
}
公共空间处置()
{
服务。停止();
}
}
公共类消息服务
{
public void Start(){}
公共无效停止(){}
}
}
我喜欢你的问题,因为它呈现了一种有趣且不同寻常的情况,但我担心如果不跳出C#在其武库中的常规程序,你将无法完成任务。你可能能够用非托管代码完成一些事情,但这是一个完全不同的主题

然而,除了这是一个有趣的问题之外……看看你正在尝试做什么。你有
MyObject
,它显然实现了
IDisposable
,并将调用
Dispose()
在该
语句的末尾使用
语句,您试图从另一个程序集中获取它的引用。我认为这不是一个好主意

我建议重新审视您的设计,并使用诸如可选参数之类的东西。对于您的情况,这可能不是“完美”的解决方案,因为您将把它传递给
foreach
循环中的每个
Execute
,但这总比跳过调试API的千头万绪要好

“如果实现
IEvent
的类没有/不能以与
IEvent
中声明的方法相同的方式实现
IEvent
指定的所有方法,则该类首先不应实现
IEvent
。”

所以你的整个程序设计可能有问题。我认为你最好修改一下你的设计,改变一些类和接口之间的关系

如果您不想这样做,有另一种(不推荐)方法来解决此问题

假设您的方法调用方是
MethodCaller
类型。您只需将界面中
Execute
的声明更改为:

void Execute(MethodCaller obj = null);

实现
IEvent
的所有类都可以忽略该参数,但您在问题中提到的类除外。

进行重写当基方法不包含参数时,重写如何包含参数?在Execute()中传递可选参数如何?我认为可选参数是实现这一点的最简单方法,没有太多的修改和影响。这很不幸。我还不如使用我当时描述的setter方法。这两种方法似乎都不是干净的解决方案。
void Execute(MethodCaller obj = null);