[英]How to correctly create a new instance of class A when you gather information about it through events?
I have a: 我有一个:
class A{
int val1, val2, val3}
In the other class I have 在另一堂课我有
static void eventA(int val1){ //invoked somewhere
EventManager eventManager1 = new EventManager();
eventManager1.ServiceResolved += new Events_ServiceResolvedEventHandler(eventB);
}
static void eventB(int val2){
EventManager eventManager1 = new EventManager();
eventManager1.AddressInfoFound += new Events_AddressFoundEventHandler(eventC);
}
static void eventC(int val3){
//CODE
}
Those events are only invoke in the order: eventA, eventB, eventC. 这些事件仅按以下顺序调用:eventA,eventB,eventC。 In the eventA I have access to the val1, in the eventB I have access to the val2 etc. How should I instatize object of class A in this class? 在eventA中,我可以访问val1,在eventB中,我可以访问val2等。 如何在该类中实例化A类的对象?
EDIT: 编辑:
uusing Bonjour;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;
namespace HomeSecurity {
class Scanner {
public static DNSSDService service;
public static DNSSDEventManager eventManager;
public static DNSSDService browse;
public static void ScanService() {
try {
service = new DNSSDService();
eventManager = new DNSSDEventManager();
eventManager.ServiceFound += new _IDNSSDEvents_ServiceFoundEventHandler(eventManager_ServiceFound);
browse = service.Browse(0, 0, "_axis-video._tcp", null, eventManager);
// Application.Run(form = new PumpingForm());
} catch (Exception e) {
Console.WriteLine("--------------------EXCEPTION-----------------");
Console.WriteLine(e);
Console.WriteLine("--------------------EXCEPTION-----------------");
}
}
static void eventManager_ServiceFound(DNSSDService browser, DNSSDFlags flags, uint ifIndex, string serviceName, string regtype, string domain) {
try {
Console.WriteLine("---------------- eventManager_ServiceFound------------------------");
Console.WriteLine("browser: " + browser + "\nDNSSDFlags " + flags + "\nifIndex " + ifIndex + "\nserviceName: " + serviceName + "\nregtype: " + regtype + "\ndomain: " + domain);
Console.WriteLine("----------------------------------------");
// DNSSDService service2 = new DNSSDService();
eventManager.ServiceResolved += new _IDNSSDEvents_ServiceResolvedEventHandler(eventManager_ServiceResolved);
browser.Resolve(flags, ifIndex, serviceName, regtype, domain, eventManager);
} catch (Exception e) {
Console.WriteLine("--------------------EXCEPTION--------eventManager_ServiceFound---------");
Console.WriteLine(e);
Console.WriteLine("--------------------EXCEPTION-----------------");
}
}
private static void eventManager_ServiceResolved(DNSSDService service, DNSSDFlags flags, uint ifIndex, string fullname, string hostname, ushort port, TXTRecord record) {
try {
Console.WriteLine("-------------------eventManager_ServiceResolved---------------------");
Console.WriteLine("DNSSDService " + service + "\nDNSSDFlags " + flags + "\nifindex " + ifIndex + "\nfullname " + fullname + "hostname " + hostname + "\nport " + port + "\nrecord " + record);
var str = System.Text.Encoding.Default.GetString(record.GetValueForKey("macaddress"));
Console.WriteLine("mac " + str);
Console.WriteLine("----------------------------------------");
// DNSSDService service2 = new DNSSDService();
eventManager.AddressFound += new _IDNSSDEvents_AddressFoundEventHandler(eventManager_AddressFound);
DNSSDAddressFamily family = new DNSSDAddressFamily();
service.GetAddrInfo(flags, ifIndex, family, hostname, eventManager);
} catch (Exception e) {
Console.WriteLine("--------------------EXCEPTION--------eventManager_ServiceResolved---------");
Console.WriteLine(e);
Console.WriteLine("--------------------EXCEPTION-----------------");
}
}
private static void eventManager_AddressFound(DNSSDService service, DNSSDFlags flags, uint ifIndex, string hostname, DNSSDAddressFamily addressFamily, string address, uint ttl) {
try {
Console.WriteLine("------------------eventManager_AddressFound----------------------");
Console.WriteLine("hostname " + hostname);
Console.WriteLine("address " + address);
Console.WriteLine("----------------------------------------");
} catch (Exception e) {
Console.WriteLine("--------------------EXCEPTION-----eventManager_AddressFound------------");
Console.WriteLine(e);
Console.WriteLine("--------------------EXCEPTION-----------------");
}
}
}
}
You could have A with a default constructor, then have 3 functions to initialize val1, val2 and val3. 您可以使用默认构造函数的A,然后使用3个函数来初始化val1,val2和val3。 I would then have a 4th function to ensure that all three values are initialized. 然后,我将有第四个函数来确保所有三个值都已初始化。
Here is rough sample how one can listen to 3 event in sequence and collect data (ie in dictionary) for first several events: 这是一个粗略的示例,一个人如何依次收听3个事件并为前几个事件收集数据(即在字典中):
class MyEventListner
{
Dictionary<string, string> fields = new Dictionary<string, string>();
public MyObject Data {get;private set;}
void HandleEvent1(EventData eventData) { fields["Field1"] = eventData.Field;}
void HandleEvent2(EventData2 eventData) { fields["Field2"] = eventData.FieldFoo;}
void HandleEvent3(EventData eventData) {
Data = new MyObject {
Field1 = fields["Field1"],
Field2 = fields["Field2"],
Filed3 = eventData.Field
}
}
MyEventListner listener = new MyEventListner ();
WhateverEventManager eventManager = new eventManager();
void Subscribe()
{
eventManager.OneEvent += d => listener.HandleEvent1(d);
eventManager.OtherEvent += d => listener.HandleEvent2(d);
eventManager.LastEvent += d => listener.HandleEvent3(d);
}
after LastEvent
fired listener.Data
will have filled out data object. 在LastEvent
触发listener.Data
之后LastEvent
将填写数据对象。 One may want to notify someone (ie via another event) that Data
is ready. 可能要通知某人(即通过另一事件) Data
已准备就绪。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.