Jak mogę uzyskać wszystkie stałe dowolnego rodzaju za pomocą odbicia?Jak mogę uzyskać wszystkie stałe typu według odbicia?
Odpowiedz
Mimo to stary kod:
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));
}
można łatwo przekształcić go czystsze kod za pomocą leków generycznych i 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();
}
lub jednym wierszu:
type.GetFields(BindingFlags.Public | BindingFlags.Static |
BindingFlags.FlattenHierarchy)
.Where(fi => fi.IsLiteral && !fi.IsInitOnly).ToList();
* My + 1 * została zanim zdążyłem przejść drugą linię ... i zauważyłem, że przechodzisz każdy krok z jego ... zamierzonym celem projektu ...! jest to ** TAK ** ważne, gdy trzeba się z niego uczyć. Chciałbym, aby każdy z twoim doświadczeniem robił tak, jak ty tutaj. – LoneXcoder
Nie jestem pewien co do stwierdzeń dotyczących IsLiteral i IsInitOnly. Podczas testowania wydaje się, że dla statycznych właściwości readonly IsLiteral ma zawsze wartość false - dlatego IsLiteral jest jedyną flagą, którą należy sprawdzić, aby znaleźć stałe i można zignorować IsInitOnly. Próbowałem z różnymi typami pól (np. String, Int32), aby zobaczyć, czy to miało jakąkolwiek różnicę, ale tak się nie stało. –
Ponadto, aby uzyskać wartość const z FieldInfo, należy użyć GetRawConstantValue(). –
użycie property.GetConstantValue(), aby uzyskać wartość
Może się tak zdarzyć, gdy * masz * własność - ale * jak * otrzymujesz nieruchomość? –
W .Net 4.5 to: 'GetRawConstantValue()' – Chris
Jako rozszerzeń Rodzaj:
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);
}
}
Oczywiście jest tak, jeśli twoje stałe na typie są wszystkimi ciągami ;-) – nashwan
Dlaczego nie (a) nie uczynić metod ogólnymi, (b) sprawić, by metody zwracały 'IEnumerable
@WaiHaLee - Zrobione :-). Chociaż oczywiście nadal zakłada, że wszystkie typy stałych w danej klasie są typu T. – nashwan
Jeśli chcieliby Państwo uzyskać wartości wszystkich stałych określonego typu, od rodzaju docelowej, tutaj jest to metoda rozszerzenie (rozszerzenie niektórych odpowiedziach na tej stronie):
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();
}
}
Następnie dla klasy jak ten
static class MyFruitKeys
{
public const string Apple = "apple";
public const string Plum = "plum";
public const string Peach = "peach";
public const int WillNotBeIncluded = -1;
}
można uzyskać string
wartości stałych tak:
List<string> result = typeof(MyFruitKeys).GetAllPublicConstantValues<string>();
//result[0] == "apple"
//result[1] == "plum"
//result[2] == "peach"
- 1. Czy mogę uzyskać podpis delegata C# według jego typu?
- 2. Jak uzyskać wszystkie elementy listy według instancji?
- 3. Jak uzyskać poprawną definicję tekstu typu ogólnego za pomocą odbicia?
- 4. Jak uzyskać wartości parametrów typu przy użyciu odbicia java?
- 5. Jak mogę uzyskać wszystkie obiekty vals i podobiektów vals za pomocą odbicia w Scali?
- 6. Uzyskaj nazwę typu T przy użyciu odbicia
- 7. Jak mogę uzyskać wartość właściwości ciągu za pomocą Odbicia?
- 8. Dla obiektu, czy mogę uzyskać wszystkie jego podklasy za pomocą odbicia lub innych sposobów?
- 9. Jak mogę uzyskać wszystkie pliki cookie CookieContainer?
- 10. Jak mogę uzyskać wszystkie kategorie i podkategorie?
- 11. Jak mogę uzyskać liczbę kolumn typu bitowego?
- 12. Jak uzyskać wszystkie wiadomości według ThreadID w Androidzie
- 13. Android: Jak znaleźć widoki według typu
- 14. Jak mogę znaleźć wszystkie DbSety, których typy generyczne pochodzą z danego typu podstawowego?
- 15. Jak mogę uzyskać wszystkie zdarzenia okna w JQuery 1.9?
- 16. Jak mogę użyć odbicia w pliku three.js?
- 17. Jak mogę dodać elementy do odbicia plastra?
- 18. Jak zdobyć dzieci kontenera WPF według typu?
- 19. Jak mogę uzyskać wszystkie rekordy kategorii kategorii w zapytaniu WordPress?
- 20. F # typu ograniczeń na teksty stałe
- 21. Raven DB: Jak mogę usunąć wszystkie dokumenty danego typu?
- 22. C# - czy wszystkie są stałe Enum?
- 23. Znajdowanie parametrów typu za pomocą odbicia w Scali 2.10?
- 24. PHFetchResult uzyskać wszystkie zdjęcia i sortować według daty niespójne
- 25. Uzyskaj typ kontenera dla typu zagnieżdżonego użyciu odbicia
- 26. Jak filtrować według typu w IntelliSense?
- 27. Jak uzyskać pełną nazwę typu?
- 28. Wybierz etykietę według typu wejściowego
- 29. Jak uzyskać wszystkie elementy pracy w iteracji?
- 30. Jak uzyskać model szkieletu typu?
http://weblogs.asp.net/whaggard/archive/2003/02/20/2708.aspx –