【问题标题】:Use lambda/linq on structs在结构上使用 lambda/linq
【发布时间】:2013-06-05 08:04:41
【问题描述】:

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

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

【问题讨论】:

  • 您当前的类/结构/常量设计没有多大意义。也许描述你真正想要实现的目标。

标签: c# asp.net linq lambda


【解决方案1】:

CODE.Status 永远不会工作,正如它所提出的那样,因为Status 是您班级中的一个类型,而不是它的成员。

你可以这样想:

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

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

如果不是,请澄清。

【讨论】:

    【解决方案2】:

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

    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 为键,长为值),但这取决于你想用它做什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-13
      相关资源
      最近更新 更多