तो मेरे मामले में मैं प्रतिबिंब का उपयोग कर कक्षा की संरचना की खोज कर रहा हूं। मुझे यह पता लगाने में सक्षम होना चाहिए कि क्या संपत्ति PropertyInfo ऑब्जेक्ट द्वारा स्वत: कार्यान्वित संपत्ति है। मुझे लगता है कि प्रतिबिंब एपीआई ऐसी कार्यक्षमता का पर्दाफाश नहीं करता है क्योंकि ऑटो-गुण सी # आश्रित हैं, लेकिन क्या यह जानकारी प्राप्त करने के लिए कोई कामकाज है?यह पता लगाने के लिए कि कोई संपत्ति प्रतिबिंब के साथ एक स्वतः-लागू संपत्ति है या नहीं?
18
A
उत्तर
16
आप देखने के लिए अगर get
या set
विधि CompilerGenerated
विशेषता के साथ चिह्नित है जांच कर सकता है। इसके बाद आप CompilerGenerated
विशेषता के साथ चिह्नित एक निजी क्षेत्र की तलाश कर सकते हैं जिसमें संपत्ति का नाम और स्ट्रिंग "BackingField"
है।
:
public static bool MightBeCouldBeMaybeAutoGeneratedInstanceProperty(
this PropertyInfo info
) {
bool mightBe = info.GetGetMethod()
.GetCustomAttributes(
typeof(CompilerGeneratedAttribute),
true
)
.Any();
if (!mightBe) {
return false;
}
bool maybe = info.DeclaringType
.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
.Where(f => f.Name.Contains(info.Name))
.Where(f => f.Name.Contains("BackingField"))
.Where(
f => f.GetCustomAttributes(
typeof(CompilerGeneratedAttribute),
true
).Any()
)
.Any();
return maybe;
}
यह सबूत, काफी भंगुर और शायद पोर्टेबल नहीं मूर्ख नहीं है करने के लिए, कहते हैं, मोनो।
7
यह करना चाहिए:
public static bool IsAutoProperty(this PropertyInfo prop)
{
return prop.DeclaringType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
.Any(f => f.Name.Contains("<" + prop.Name + ">"));
}
कारण है कि ऑटो-संपत्तियों के लिए समर्थन FieldInfo
की Name
संपत्ति दिखाई देगा:
<PropertName>k__BackingField
पात्रों <
और >
के बाद से प्रदर्शित नहीं होगा सामान्य क्षेत्रों के लिए, उस तरह के नामकरण वाले क्षेत्र को ऑटो-प्रॉपर्टी के बैकिंग फ़ील्ड में इंगित किया जाता है। जैसा कि जेसन कहते हैं, अभी भी इसका भंगुर है।
या यह एक बालक तेजी से बनाने के लिए,
public static bool IsAutoProperty(this PropertyInfo prop)
{
if (!prop.CanWrite || !prop.CanRead)
return false;
return prop.DeclaringType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
.Any(f => f.Name.Contains("<" + prop.Name + ">"));
}
संबंधित मुद्दे
- 1. यह बताएं कि कोई संपत्ति मौजूद है या नहीं है
- 2. संपत्ति के लिए, या संपत्ति के लिए नहीं?
- 3. निर्धारित करें कि कोई संपत्ति प्रतिबिंब
- 4. यह पता लगाने के लिए कि कोई फ़ाइल पीडीएफ या टीआईएफएफ है या नहीं?
- 5. यह पता लगाने के लिए कि कोई छवि बंडल के भीतर मौजूद है या नहीं?
- 6. कोको: यह पता लगाने के लिए कि कोई एनएसएसटींग अपरिवर्तनीय या परिवर्तनीय है या नहीं?
- 7. यह पता लगाने के लिए कि कोई कनेक्टेड यूएसबी प्रिंटर चालू या बंद है या नहीं?
- 8. का पता लगाने के SimpleXML सरणी संपत्ति
- 9. यह पता लगाने के लिए कि विंडोज
- 10. क्या यह पता लगाने का एक सामान्य तरीका है कि संपत्ति का प्रकार एक संख्यात्मक प्रकार है या नहीं?
- 11. यह पता लगाने के लिए कि कोई फ़ाइल बैच फ़ाइल
- 12. यह पता लगाने के लिए कि मेरे आईओएस एप्लिकेशन का कोई नया संस्करण है या नहीं?
- 13. यह पता लगाने के लिए कि किसी HTML पृष्ठ में कोई वीडियो है या नहीं?
- 14. यह पता लगाने के लिए कि कोई विशिष्ट ड्राइव हार्ड ड्राइव है या नहीं?
- 15. यह पता लगाने के लिए कि कोई टाइमर चल रहा है या नहीं?
- 16. यह पता लगाने के लिए कि कोई प्रोग्राम उपप्रोसेस से क्रैश हो गया है या नहीं?
- 17. यह पता लगाने के लिए कि कोई वेबसाइट HSTS
- 18. यह पता लगाने के लिए कि कोई उपयोगकर्ता PHP
- 19. संपत्ति प्रकार का पता लगाने के लिए PropertyInfo का उपयोग
- 20. यह पता लगाने के लिए कि एक चल रही लिनक्स मशीन निष्क्रिय है या नहीं
- 21. यह पता लगाने के लिए कि होस्ट डिवाइस आईफोन या आईपैड है या नहीं?
- 22. क्या यह पता लगाने का कोई तरीका है कि कोई ड्राइव एसएसडी है या नहीं?
- 23. यह पता लगाने के लिए कि स्क्रीन एंड्रॉइड डिवाइस में कैपेसिटिव या प्रतिरोधी है या नहीं?
- 24. कैसे जांचें कि कोई संपत्ति मौजूद है या नहीं?
- 25. यह पता लगाने के लिए कि जीपीएस सिग्नल कमजोर या उच्च है या नहीं?
- 26. यह पता लगाने के लिए कि क्या जेएमएस कनेक्शन है?
- 27. यह निर्धारित करने के लिए कि कोई कुंजी एक अक्षर या संख्या है या नहीं?
- 28. यह पता लगाने के लिए कि कोई विज़िटर मानव है और मकड़ी नहीं है
- 29. .chosen.change() - यह पता लगाने के लिए कि क्या यह एक चुनिंदा या अचयनित कार्रवाई है
- 30. यह पता लगाने के लिए कि कोई प्रकार एक इटरेटर या const_iterator
धन्यवाद एक बहुत जेसन, परावर्तक मुझे बीच में ही कहा था :) पहले इसके बारे में सोचा जाना चाहिए। – Zoki
@ 3o4eTo: बस आगाह किया जाए कि यह मूर्ख प्रमाण, भंगुर और संभवतः मोनो को पोर्टेबल नहीं है। – jason
संपत्ति पर कोई गेटटर नहीं होने पर भी अपवाद का ख्याल रखना। – nawfal