变量名称为String

时间:2012-11-21 14:14:40

标签: c#

我有一个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);
    }
}

}

3 个答案:

答案 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将类中的属性映射到文件中的属性),或者直接在类中设置数据。

然后,您可以将此配置类添加到项目中,并根据需要将其转换为字典。