У меня есть класс,который я хотел бы добавить эквивалент указателя функции C.
Я хотел бы иметь возможность добавить эквивалент c# указателя функции C в класс 'clientInfo' ниже. Это позволит мне избавиться от оператора switch при обработке входящих данных. Данные "clientInfo" инициализируются и помещаются в список "clientInfo", из которого могут быть обработаны входящие данные.
публичный класс dataFormat
{
общественного строка имя-канала;
публичное байтовое расположение данных;
общественные байт lengthbytes;
формат public FormatType;
// Я хочу добавить здесь эквивалент указателя функции
}
публичный класс clientInfo
{
описание публичной строки;
адреса общественных типа uint16 ;
общественные байт приложения в P;
публичный список данных & lt;dataformat> data;
}
List< clientinfo> clientList = новый список & lt;clientinfo>();
// фиктивные данные для тестирования
byte[] tooldesc = new byte[] {0x5A, 0x55, 0x55, TOOL_INFO_READ, 0x10, 0x00, 0x30, 0x31, 0x40, 0x01, 0x02, 0x03, 0x54, 0x65, 0x73, 0x74, 0x20, 0x54, 0x6F, 0x6F, 0x6C, 0xFF, 0xFF, 0xA5};
публичная основная форма()
{
метод InitializeComponent();
InitialiseTools (); / / настройка данных инструмента
// Теперь просто пример того, как я обрабатываю входящие данные
// использование tooldesc, определенного выше.
List< byte [] & gt; bufferr = новый список & lt;byte[]>();
буферр.Добавить (tooldesc);
int n = 0;
for (int clientIdx = 0; clientIdx < clientList.Count; clientIdx++)
{
if (clientList[clientIdx]. address == 0x5555)
{
// Вместо того, что приведенная ниже инструкция выключатель, функция
// указатель сможет вызвать назначенную функцию
// например ProcessGammaCCL () и т. д.
int type = (int)(clientList[clientIdx].приложения в P);
тип коммутатора)
{
случай 0xB8:
ProcessGammaCCl(clientIdx, bufferr[n]);
перерыв;
случай 0x89:
UpdateToolTable(clientIdx, bufferr[n]);
перерыв;
по умолчанию:
перерыв;
}
}
}
}
частный недействительными InitialiseTools()
{
// В идеале считывать данные из ini-файла в данные инструмента и добавлять их в клиент
// список
// Может добавить функцию ptr для соответствующего вызова функции
clientinfo tool = новый clientInfo();
tool. description = " описание инструмента";
tool. address = 0x5555;
инструмент.pCode = 0x89;
var channelInfo = новый список & lt;dataformat>
{
новый формат данных
{
channelName = " адрес",
dataPosition = 1,
lengthbytes = 2,
формат = FormatType.s16lsb
},
новый формат данных
{
channelName = " описание",
dataPosition = 12,
lengthbytes = 4,
формат = FormatType.ул.
},
};
инструмент.data = channelInfo;
clientList.Добавить(инструмент);
/ Инструмент / гамма ККЛ
clientInfo tool1 = новый clientInfo();
tool1. description = " Gamma GCL";
tool1. address = 0x5555;
инструмент1.pCode = 0xB8;
channelInfo = новый список & lt;dataformat>
{
новый формат данных
{
channelName = " отметка времени",
dataPosition = 6,
lengthbytes = 4,
формат = FormatType.u32lsb
},
новый формат данных
{
channelName = " CCL",
dataPosition = 10,
lengthbytes = 2,
формат = FormatType.s12bitlsb
},
новый формат данных
{
имя-канала = "статус-ВЛ ОК ",
dataPosition = 11,
lengthbytes = 1,
формат = FormatType.bitMask0x10
},
новый формат данных
{
имя-канала = "счетчик гамма ",
dataPosition = 12,
lengthbytes = 2,
формат = FormatType.u16lsb
}
};
tool1. data = channelInfo;
clientList. Add(tool1);
}
private void ProcessGammaCCl(int i, Byte[] buffer)
{
.......
int bufferPos = clientList[i]. data[0]. dataPosition;
.......
}
Что я уже пробовал:
Я погуглил это toopic и нашел ссылки на использование делегатов и функций< & gt;, Но не нашел ничего, что я мог бы понять и imlement!