0

我在一个看起来像这样的类中有我的常量:

public partial class CODE
{
    public struct Status
    {
        public const long Registered    = 5;
        public const long Active        = 6;
    }
}

我想在常量上使用 lambda(这不起作用):

var foo = CODE.Status.Where(x=> x > 5);

我制作了一种方法,可以从我的结构中生成字典,这有点接近我的需要。问题是我对这些部分没有任何智能感知。我必须将它们作为字符串传递(由于动态数据类型)。

有什么方法可以让我的示例与我当前的常量类一起工作?


private Dictionary<string, Dictionary<string, dynamic>> GenerateConstants(
List<Type> classTypes)
{
    var ret = new Dictionary<string, Dictionary<string, dynamic>>();

    foreach (Type t in classTypes)
    {
        var fields = new Dictionary<string, dynamic>();

        var structs = t.GetNestedTypes().Where(x => x.IsValueType && 
                                              !x.IsPrimitive && !x.IsEnum);

        foreach (var nestedStruct in structs)
        {
            var innerFields = new Dictionary<string, dynamic>();

            foreach (var field in nestedStruct.GetFields())
            {
                innerFields.Add(field.Name, field.GetValue(null));
            }

            fields.Add(nestedStruct.Name, innerFields);
        }

        foreach (var field in t.GetFields())
        {
            if (field.FieldType == typeof(long))
            {
                fields.Add(field.Name, field.GetValue(null));
            }
        }

        ret.Add(t.Name, fields);
    }

    return ret;
}

var constants = GenerateConstants(new List<Type> { typeof(CODE) });

var foo = constants.FirstOrDefault(x => x.Key == "CODE");
4

2 回答 2

0

如果你想要一个项目列表,你可以在其中使用智能感知对键进行寻址,我会按照以下几行做一些事情:

public partial class CODE
{
    public const long Registered    = 5;
    public const long Active        = 6;

    public List<long> StatusList;

    public Status()
    {
        StatusList = new Dictionairy<int, long>();
        StatusList.Add(Registered);
        StatusList.Add(Active);
    }
}

由于它是一个列表,您应该能够使用 Linq,并且您可以使用公共 const 值来检查您的“项目类型”(例如,如果您在列表上执行 foreach,您可以在 if/else 语句中使用它们或在您的环形)。

实际的实现可能会更漂亮(字典以 Enumerable 为键,长为值),但这取决于你想用它做什么。

于 2013-06-05T09:29:43.227 回答
0

CODE.Status永远不会起作用,正如它所提出的那样,原因Status是你班级中的一种类型,而不是它的成员。

你可以考虑这样的事情:

public partial class CODE
{
    public struct Status
    {
        public static readonly long Registered    = 5; //STATIC
        public static readonly long Active        = 6; //STATIC
    }
}

通过这种方式,您可以访问这些字段,但我不清楚这是否完全回答了您的问题。

如果不是,请澄清。

于 2013-06-05T08:06:53.230 回答