У меня есть класс, который вызывает событие. Я хочу, чтобы подписчик мог изменять значения, передаваемые в EventArg.Не похоже, чтобы передать EventArgs по ссылке
В классе, который поднимает события:
class Factory
{
public event EventHandler<MessageReceivedEventArgs> MessageReceived;
private IServerLib _myObject;
public void Connect()
{
_myObject = new ServerLib();
_myObject.AddMessageReceivedHandler((short terminal, ref string message, ref short functionNo) =>
{
MessageReceivedEventArgs args = new MessageReceivedEventArgs { Terminal = terminal, Message = message, FunctionNo = functionNo };
MessageReceivedEvent(ref args);
});
}
private void MessageReceivedEvent(ref MessageReceivedEventArgs args)
{
EventHandler<MessageReceivedEventArgs> handler = MessageReceived;
if (handler != null)
{
handler(this, args);
}
}
public class MessageReceivedEventArgs : EventArgs
{
public short Terminal { get; set; }
public string Message { get; set; }
public short FunctionNo { get; set; }
}
}
interface IServerLib
{
void AddMessageReceivedHandler(MessageReceivedEventHandler action);
}
public delegate void MessageReceivedEventHandler(short terminal, ref string message, ref short functionNo);
Абонент (который бывает VB) выглядит следующим образом:
Dim WithEvents _va As MyAssembly.MyClass
Private Sub _va_MessageReceived(sender As Object, e As Factory.MessageReceivedEventArgs) Handles _va.MessageReceived
Debug.WriteLine($"Message: {e.Message} Terminal: {e.Terminal} Function: {e.FunctionNo}")
If e.Message = "1" Then
e.Message = ""
e.FunctionNo = 0
Debug.WriteLine("Cancelled")
End If
End Sub
Это вызывает событие, но установка e.Message и e.Function, похоже, не устанавливают значения. Я делаю что-то неправильно?
Если вы считаете, что ваши параметры «ref» будут затронуты, тогда да - вы делаете что-то неправильно, они не будут. Вместо этого передайте экземпляр MessageReceivedEventArgs в MessageReceivedEvent. – Evk
@Evk - Я считаю, что я делаю это 'handler (это, args);' 'args' является экземпляром –
Вы можете показать код, который действительно компилируется? (Так как '(short x, ref string y, ref short z) =>' не разрешено, этот код кажется ошибочным. –