我的常量在类看起来像这样:
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");
答案 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的字典作为键和长值),但这取决于你想用它做什么。