如何使用反射获取任何类型的所有常量?如何通过反射获取某个类型的所有常量?
回答
虽然这是一个旧的代码:
private FieldInfo[] GetConstants(System.Type type)
{
ArrayList constants = new ArrayList();
FieldInfo[] fieldInfos = type.GetFields(
// Gets all public and static fields
BindingFlags.Public | BindingFlags.Static |
// This tells it to get the fields from all base types as well
BindingFlags.FlattenHierarchy);
// Go through the list and only pick out the constants
foreach(FieldInfo fi in fieldInfos)
// IsLiteral determines if its value is written at
// compile time and not changeable
// IsInitOnly determine if the field can be set
// in the body of the constructor
// for C# a field which is readonly keyword would have both true
// but a const field would have only IsLiteral equal to true
if(fi.IsLiteral && !fi.IsInitOnly)
constants.Add(fi);
// Return an array of FieldInfos
return (FieldInfo[])constants.ToArray(typeof(FieldInfo));
}
您可以轻松地将其转换为更清晰的代码使用泛型和LINQ:
private List<FieldInfo> GetConstants(Type type)
{
FieldInfo[] fieldInfos = type.GetFields(BindingFlags.Public |
BindingFlags.Static | BindingFlags.FlattenHierarchy);
return fieldInfos.Where(fi => fi.IsLiteral && !fi.IsInitOnly).ToList();
}
或用一条线:
type.GetFields(BindingFlags.Public | BindingFlags.Static |
BindingFlags.FlattenHierarchy)
.Where(fi => fi.IsLiteral && !fi.IsInitOnly).ToList();
*我+ 1 *被在我甚至通过第二条线之前......我注意到你正在经历每一步......以意向为目的的设计目的......!当人们需要从中吸取教训时,这很重要。我希望每个有你的经验的人都能像你这样做。 – LoneXcoder 2012-12-10 08:49:16
我不确定关于IsLiteral和IsInitOnly的断言。在测试看来,对于静态只读属性IsLiteral总是假 - 因此IsLiteral是唯一需要检查以查找常量的标志,并且您可以忽略IsInitOnly。我尝试过使用不同的字段类型(例如String,Int32)来查看这是否有所作为,但没有。 – 2015-05-05 09:55:02
此外,要从FieldInfo获取const的值,请使用GetRawConstantValue()。 – 2015-07-07 00:15:48
使用property.GetConstantValue()来获得价值
当你拥有房产时,情况可能就是这样 - 但是,你是如何获得房产的? – 2015-12-14 10:15:11
在.Net 4.5中它是:'GetRawConstantValue()' – Chris 2016-03-11 20:16:03
为类型的扩展名:
public static class TypeExtensions
{
public static IEnumerable<FieldInfo> GetConstants(this Type type)
{
var fieldInfos = type.GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy);
return fieldInfos.Where(fi => fi.IsLiteral && !fi.IsInitOnly);
}
public static IEnumerable<T> GetConstantsValues<T>(this Type type) where T : class
{
var fieldInfos = GetConstants(type);
return fieldInfos.Select(fi => fi.GetRawConstantValue() as T);
}
}
如果你想获得的值的特定类型的所有常量,从目标类型,在这里是一个扩展方法(此页面上延伸一些问题的答案):
public static class TypeUtilities
{
public static List<T> GetAllPublicConstantValues<T>(this Type type)
{
return type
.GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy)
.Where(fi => fi.IsLiteral && !fi.IsInitOnly && fi.FieldType == typeof(T))
.Select(x => (T)x.GetRawConstantValue())
.ToList();
}
}
然后,对于一类这样
static class MyFruitKeys
{
public const string Apple = "apple";
public const string Plum = "plum";
public const string Peach = "peach";
public const int WillNotBeIncluded = -1;
}
您可以获取string
常数值如下:
List<string> result = typeof(MyFruitKeys).GetAllPublicConstantValues<string>();
//result[0] == "apple"
//result[1] == "plum"
//result[2] == "peach"
- 1. 如何通过反射来获取类中某个属性的“类类型”?
- 2. ObservableArrayList:如何通过反射获取通用类型?
- 3. 如何通过反射获取集合中包含的类型
- 4. 如何通过反射获取EntityReference类型的PropertyInfo.PropertyType名称
- 5. 如何通过反射获取由Ruby的Module类定义的常量?
- 6. 通过反射获取.Net对应类型的C#类型
- 7. 通过反射获取所有内部类
- 8. 如何通过反射获取委托类型的返回类型?
- 9. 如何获取包中所有类通用的常量变量?
- 10. 如何通过.GetType获取类常量()
- 11. 无法通过反射获取泛型类型的属性
- 12. 通过反射获取子类字段
- 13. 在运行时通过反射获取通用字段类型
- 14. 如何通过反射获得成员的类型?
- 15. 获取数组类型元素的(通过反射)
- 16. 反射从DLL中的所有类型获取值
- 17. 如何通过反射来获取和使用类/实体类型?
- 18. 有没有办法通过反射来获取类型的别名?
- 19. 如何获取某个城市中某个类型的所有Google地点?
- 20. 通过反射在mscorlib 2.0.5.0(又名Silverlight mscorlib)中获取类型?
- 21. 获取方法通过反射返回类型
- 22. 如何通过反射从引用的程序集中获取类型
- 23. 使用反射获取所有Integer数据类型字段
- 24. 使用反射来获取所有属性并通过方法
- 25. 使用反射或通过HttpContext.Current.Server.GetLastError()获取上一个异常
- 26. umbraco - 如何通过文档类型获取所有节点
- 27. 通过C#中的反射获取对某些类字段的引用
- 28. 使用反射获取MemberInfo的类型
- 29. 反射获取FieldInfo对象的类型?
- 30. 如何获取某种类型的所有小部件?
http://weblogs.asp.net/whaggard/archive/2003/02/20/2708.aspx – 2012-04-21 18:38:44