Доступ к констатации класса, определенные в полученном классеC#

Место общения программистов C#
Ответить
Anonymous
 Доступ к констатации класса, определенные в полученном классе

Сообщение Anonymous »

Написание драйвера Modbus, с общим базовым классом, обрабатывающей общие операции Modbus, с полученными классами, определяющими их конкретные реализации. < /p>
Это упрощенный пример. У меня есть абстрактный класс < /p>

Код: Выделить всё

public abstract class A
{
protected virtual ushort MinRegister => 0;
protected virtual ushort MinRegister => 0;
}
и полученный класс, который также содержит класс только с const s

Код: Выделить всё

public class B : A
{
protected override ushort MinRegister => Functions.GetTemperature;
protected override ushort MaxRegister => Functions.SetHumidity;

class MODBUSRegisterAddresses // register addresses
{
public const ushort GetTemperature = 0;
public const ushort GetHumidity = 10;
public const ushort SetTemperature = 300;
public const ushort SetHumidity = 310;
}
}
Класс ModbusregisterAddresses обеспечивает хороший способ определения регистров с сильным набором. Эти значения используются во многих местах, и я предпочитаю Consts, чтобы использовать числовые. Enum был идеей, но извлечение базового значения из перечисления требует дополнительного кода. До сих пор этот подход был удобным.

Код: Выделить всё

values = ReadRegisters(device.SlaveAddress, RegisterMin, (ushort)(RegisterMax - RegisterMin + 1));
Теперь я хотел бы получить доступ к All реестра адресовано индивидуально в функции в базовом классе. Идея была отражением. Что-то вроде < /p>

Код: Выделить всё

public abstract class A
{
internal static class MODBUSRegisterAddresses { }

private readonly Lazy getFunctions = new Lazy(() =>
{
return typeof(MODBUSRegisterAddresses).GetFields(
System.Reflection.BindingFlags.Public |
System.Reflection.BindingFlags.Static |
System.Reflection.BindingFlags.FlattenHierarchy).
Where(fi => fi.IsLiteral && !fi.IsInitOnly).
Select(fi => fi.GetValue(null)).
OfType().
Distinct();
});
Но класс modbusregisteraddresses не является участником, и это только компилируется с новым ключевым словом в реализации класса ModbusregisterAddresses . Базовый класс не знает о полученном классе ModbusregisterAddresses . Я знаю, что это неправильно.>

Подробнее здесь: https://stackoverflow.com/questions/797 ... ived-class
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»