在结构上使用lambda / linq

时间:2013-06-05 08:04:42

标签: c# asp.net linq lambda

我的常量在类看起来像这样:

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");

2 个答案:

答案 0 :(得分: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
    }
}

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

如果不是,请澄清。

答案 1 :(得分: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);
    }
}

因为它是一个List你应该能够使用Linq并且你可以使用公共const值来检查你的'item type'(例如,如果你在你的列表上做foreach,你可以在if / else语句中使用它们或者在你的循环中切换。)

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