我有一个CParam字典,注册为密钥,
CParam有一个从外部文本文件读取的字段,Description用作读取HumanDesc的键。
文本文件是翻译文件,描述必须是字符串。 像这样的东西
PLACE_HOLDER1 "First Place where things are put"
PLACE_HOLDER2 "Secod Place where things are put"
.....
我可以通过插入Register并将其放在引号中来轻松完成此操作。但是有一个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);
}
}
}
答案 0 :(得分:2)
我不确定我理解你的是什么,但是如果注册变量不是const,你可以这样做:
1.为CParam添加另一个构造函数
public class CParam
{
....
public CParam(Expression<Func<ushort>> ex, string t_HumanDesc, ushort DefaultVal)
{
Content = DefaultVal;
HumanDesc = t_HumanDesc;
Description = ((MemberExpression) ex.Body).Member.Name;
Register = ex.Compile().Invoke();
}
};
2.Chage您的设备类如下:
internal static class Device1
{
public static ushort PLACE_HOLDER1 = 0x0123;
public static ushort PLACE_HOLDER2 = 0x0125;
public static 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 One Holder", 100)},
{PLACE_HOLDER2, new CParam(() => PLACE_HOLDER1, "Place Two Holder", 200)}
};
}
}
注意这对const变量不起作用!
答案 1 :(得分:0)
要获取变量名称,您需要使用Reflection类,但不能使用值对值类型的反射
答案 2 :(得分:0)
您可以使用Reflection.Emit
构建一个包含所需属性的类,但对我而言,它会感觉很乱,并且您将缺少IntelliSense,因为成员将在运行时生成(导致您使用字符串时出现同样的问题)
如果文件结构是可靠的并且可以依赖,为什么不创建一个从配置文件生成类文件的小实用程序?然后,您可以使用该类作为占位符,在运行时使用配置文件中的数据填充成员(使用Reflection将类中的属性映射到文件中的属性),或者直接在类中设置数据。
然后,您可以将此配置类添加到项目中,并根据需要将其转换为字典。