Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从另一个方法调用参数_C# - Fatal编程技术网

C# 从另一个方法调用参数

C# 从另一个方法调用参数,c#,C#,我需要从ResponseReceived处理程序中调用回调操作。 如果有更好的办法,我是非常开放的 Connection和IDriver来自不同的程序集。试着让他们一起工作 class Test : IDriver { private Connection _connection; public void Initialize() { _connection = new Connection(new ResponseCallback(ResponseRe

我需要从
ResponseReceived
处理程序中调用
回调
操作。
如果有更好的办法,我是非常开放的

Connection
IDriver
来自不同的程序集。试着让他们一起工作

class Test : IDriver
{
    private Connection _connection;

    public void Initialize()
    {
        _connection = new Connection(new ResponseCallback(ResponseReceived));
    }

    public void Begin(Action<OperationResponse> callback)
    {
        _connection.SendRequest();
    }

    private static void ResponseReceived(object source, MessageReceivedArgs e)
    {
        // Need to invoke `callback` parameter of Begin from here.
    }
类测试:IDriver
{
专用连接(u连接),;
公共无效初始化()
{
_连接=新连接(新响应Callback(ResponseReceived));
}
公共作废开始(操作回调)
{
_connection.SendRequest();
}
接收到私有静态void响应(对象源,MessageReceivedArgs e)
{
//需要从这里调用Begin的'callback'参数。
}

将传入的
操作
实例分配到一个私有字段,以供以后使用

此外,我还删除了
ResponseReceived
上的
static
关键字。您无法从静态方法访问实例变量。如果您确实希望它是静态的,您还必须通过
测试的实例(可能是
源代码
,在这种情况下,您可以将其转换回
测试
,以获得
\u回调
实例)

类测试:IDriver
{
专用连接(u连接),;
私人行动;
公共无效初始化()
{
_连接=新连接(新响应Callback(ResponseReceived));
}
公共作废开始(操作回调)
{
_connection.SendRequest();
_回调=回调;
}
私有void ResponseReceived(对象源,MessageReceivedArgs e)
{
_回调(responseInstanceHere);
}
争论点
  • 如果在回调发生之前多次使用不同的回调调用Begin,您希望发生什么情况?选项包括:
    • 使用传入的最新或第一个回调
    • 抛出异常
  • 如果在开始之前调用了
    ResponseReceived
    ,您希望发生什么?这可能吗?空回调应该抛出一个NRE还是应该忽略它
  • 实例是否可以重用?是否应在至少进行一次调用后清除回调

简而言之,您的代码可能会在适用的情况下使用一些错误检查和有用的异常。我不打算添加它们,因为我不知道这种类型的使用上下文。

如果在
开始之前调用
ResponseReceived
,这将出现错误。我会添加一个空检查,并抛出一个有用的错误,通常有一个方法依赖它先前对另一个人的呼唤充其量也显得脆弱当变量不为null时,方法必须抛出InvalidOperationException。@Liam-我更喜欢异常,它会让您立即知道代码是错误的,而不是等待永远不会发生的回调。但哪个更正确,还有待讨论,也可能取决于上下文。@Liam我已经添加了一些关于uld被添加用于错误检查。这个设计看起来非常脆弱。让一个方法依赖于前一个方法的调用在我看来似乎是个坏主意。你为什么需要这个结构?我已经更新了一点文本。
class Test : IDriver
{
    private Connection _connection;
    private Action<OperationResponse> _callback;
    public void Initialize()
    {
        _connection = new Connection(new ResponseCallback(ResponseReceived));
    }

    public void Begin(Action<OperationResponse> callback)
    {
        _connection.SendRequest();
        _callback = callback;
    }

    private void ResponseReceived(object source, MessageReceivedArgs e)
    {
        _callback(responseInstanceHere);
    }