在这段代码中,他们使用了这种结构而不是枚举:
包含所有公共静态字符串的公共类。
是否可以枚举类中的静态字符串?
答案 0 :(得分:6)
这将枚举类MyClass
中的公共静态字段的字符串值:
var flags = BindingFlags.Public | BindingFlags.Static;
var query = typeof(MyClass)
.GetFields(flags)
.Where(fieldInfo => fieldInfo.FieldType == typeof(string))
.Select(fieldInfo => fieldInfo.GetValue(null));
foreach (var value in query) {
// ...
}
对于公共静态属性,它几乎相同:
var flags = BindingFlags.Public | BindingFlags.Static;
var query = typeof(MyClass)
.GetProperties(flags)
.Where(propertyInfo => propertyInfo.PropertyType == typeof(string))
.Select(propertyInfo => propertyInfo.GetValue(null, null));
foreach (var value in query) {
// ...
}
答案 1 :(得分:1)
使用反射:
yourobject.GetType().GetFields(BindingFlags.Static|BindingFlags.Public)
将返回班级的所有静态字段。
答案 2 :(得分:0)
我开始在其他答案之前写这个,所以也可以发布我的答案。
public class PublicStringIteration
{
static void Main(string[] args)
{
MyStrings myStrings = new MyStrings();
foreach (string value in myStrings.GetStaticFieldValues())
{
Console.WriteLine(value);
}
}
}
public class MyStrings
{
public static string String1 = "String1 Value";
public static string String2 = "String2 Value";
public static string String3 = "String3 Value";
}
public static class MyStringsExtensions
{
public static IEnumerable<string> GetStaticFieldValues(this MyStrings myStrings)
{
Type myClassType = typeof(MyStrings);
foreach (MemberInfo info in myClassType.GetMembers())
{
if (info.MemberType == MemberTypes.Field)
{
yield return myClassType.GetField(info.Name).GetValue(info).ToString();
}
}
}
}