У меня есть словарь CParam Регистр как ключ,имени переменного в строку
CParam имеет одно поле, которое считывается из внешнего текстового файла и описание используется в качестве ключа для чтения в HumanDesc.
Текстовый файл - это файл перевода, а описание должно быть строкой. Нечто подобное
PLACE_HOLDER1 "First Place where things are put"
PLACE_HOLDER2 "Secod Place where things are put"
.....
Я могу легко сделать это путем вставки регистра, как и поместив его в кавычки. Но есть 100 регистров, и это было бы утомительно (и не очень элегантно). Есть ли способ, с помощью которого конструктор может справиться с этим для меня.
Ниже приведен очень упрощенный пример того, что я ма пытаюсь сделать:
using System;
using System.Collections.Generic;
namespace Var2String
{
public class CParam
{
public ushort Register;
public string Description;
public ushort Content;
public string HumanDesc;
public CParam(ushort t_Register, string t_Description, string t_HumanDesc, ushort DefaultVal)
{
Register = t_Register;
Description = t_Description;
Content = DefaultVal;
HumanDesc = t_HumanDesc;
}
};
static class Device1
{
public const ushort PLACE_HOLDER1 = 0x0123;
public const ushort PLACE_HOLDER2 = 0x0125;
public const ushort PLACE_HOLDER_SAME_AS_1 = 0x0123;
public static Dictionary<ushort, CParam> Registers;
static Device1()
{
Registers = new Dictionary<ushort, CParam>()
{
{PLACE_HOLDER1, new CParam(PLACE_HOLDER1,"PLACE_HOLDER1","Place One Holder",100)},
{PLACE_HOLDER2, new CParam(PLACE_HOLDER1,"PLACE_HOLDER2","Place Two Holder",200)}
};
/*
* Like to be able to do this
* And constructor CParam
Registers = new Dictionary<ushort, CParam>()
{
{PLACE_HOLDER1, new CParam(PLACE_HOLDER1,"Place One Holder",100)},
{PLACE_HOLDER2, new CParam(PLACE_HOLDER1,"Place Two Holder",200)}
};
*/
}
}
class Program
{
static private string LookUpTranslationFor(string Key)
{
string Translated = "Could not find Val for " + Key;
//This would read XML file use Key to get translation
return Translated;
}
static void Main(string[] args)
{
Console.WriteLine(Device1.Registers[Device1.PLACE_HOLDER1].HumanDesc);
Console.WriteLine(Device1.Registers[Device1.PLACE_HOLDER2].HumanDesc);
Device1.Registers[Device1.PLACE_HOLDER2].HumanDesc = LookUpTranslationFor(Device1.Registers[Device1.PLACE_HOLDER2].Description);
Console.WriteLine(Device1.Registers[Device1.PLACE_HOLDER2].HumanDesc);
Console.ReadKey(true);
}
}
}
Да, это сделало бы это. Раньше я смотрел на Exression, я пытался избежать использования Linq, и PLACE_HOLDERS1 не может быть изменен. Но в противном случае это сработает, и я буду использовать его, если не найду другого решения. –
Вы можете сделать PLACE_HOLDER1 readonly, чтобы никто не мог его изменить. – HoberMellow
Я не могу использовать readonly в операторах case, и случай используется во многих местах существующего кода. –