मेरे पास ऑब्जेक्ट्स की एक सूची है, जिसमें से मैं संकलन-समय के प्रकार को नहीं जान सकता।जेनेरिक प्रकारों के प्रतिबिंब का उपयोग करके गणना संपत्ति कैसे प्राप्त करें
मुझे इन वस्तुओं में से किसी एक को पहचानने की आवश्यकता है जहां 'गणना' संपत्ति मौजूद है, और यदि यह करता है तो मूल्य प्राप्त करें।
इस कोड को सरल संग्रह प्रकार के लिए काम करता है:
PropertyInfo countProperty = objectValue.GetType().GetProperty("Count");
if (countProperty != null)
{
int count = (int)countProperty.GetValue(objectValue, null);
}
समस्या यह है कि इस तरह के IDictionary<TKey,TValue>
के रूप में सामान्य प्रकार के लिए काम नहीं करता है, है। उन मामलों में, 'countProperty' मान शून्य के रूप में वापस किया जाता है, भले ही इंस्टेंट ऑब्जेक्ट में 'गणना' गुण मौजूद है।
मैं बस इतना करना चाहता हूं कि किसी भी संग्रह/शब्दकोश आधारित वस्तु की पहचान करें और इसका आकार ढूंढें, यदि उसके पास है।
संपादित करें: के रूप में अनुरोध किया है, यहाँ कि
private static void GetCacheCollectionValues(ref CacheItemInfo item, object cacheItemValue)
{
try
{
//look for a count property using reflection
PropertyInfo countProperty = cacheItemValue.GetType().GetProperty("Count");
if (countProperty != null)
{
int count = (int)countProperty.GetValue(cacheItemValue, null);
item.Count = count;
}
else
{
//poke around for a 'values' property
PropertyInfo valuesProperty = cacheItemValue.GetType().GetProperty("Values");
int valuesCount = -1;
if (valuesProperty != null)
{
object values = valuesProperty.GetValue(cacheItemValue, null);
if (values != null)
{
PropertyInfo valuesCountProperty = values.GetType().GetProperty("Count");
if (countProperty != null)
{
valuesCount = (int)valuesCountProperty.GetValue(cacheItemValue, null);
}
}
}
if (valuesCount > -1)
item.Count = valuesCount;
else
item.Count = -1;
}
}
catch (Exception ex)
{
item.Count = -1;
item.Message = "Exception on 'Count':" + ex.Message;
}
}
काम नहीं करता है यह सरल संग्रह पर ठीक से काम करता है, लेकिन एक वर्ग मेरे पास है जो Dictionary<TKey,TValue>
से ली गई है से बनाए गए एक वस्तु पर नहीं कोड की पूरी सूची है । यानी
CustomClass :
Dictionary<TKey,TValue>
CacheItemInfo बस एक साधारण वर्ग है कि कैश मदों के लिए गुण होता है - यानी, कुंजी, गिनती, प्रकार, समाप्ति दिनांक
(आईडीआई 'के संदर्भ में सोचने में मदद नहीं होगी, क्योंकि' गेट टाइप() 'हमेशा * कंक्रीट * प्रकार वापस लौटाएगा, जो कुछ भी हो सकता है, लेकिन संभवतः' डिक्शनरी ') –
यहां कोड है यह खड़ा है - अभी भी काम नहीं करता है। –
तो उत्तर प्रतिबिंब को अनदेखा करना था और केवल इंटरफेस पर डालना था - नीचे सही उत्तर देखें। –