मैं सिर्फ कल समान मुद्दा था जब मेरे अपने DependencyProperty परीक्षण करने के लिए कोशिश कर रहा है वर्ग बनाना मैं इस सवाल पर आया, और देखा कि निर्भरता गुणों को अपंजीकृत करने का कोई वास्तविक समाधान नहीं था। तो मैंने यह देखने के लिए Red Gate .NET Reflector का उपयोग करके कुछ खुदाई की थी कि मैं क्या कर सकता हूं।
DependencyProperty.Register
भार के को देखते हुए, वे सब DependencyProperty.RegisterCommon
को इंगित लग रहा था। यदि संपत्ति पहले से ही
FromNameKey key = new FromNameKey(name, ownerType);
lock (Synchronized)
{
if (PropertyFromName.Contains(key))
{
throw new ArgumentException(SR.Get("PropertyAlreadyRegistered",
new object[] { name, ownerType.Name }));
}
}
दूसरा पंजीकृत है, DependencyProperty
DependencyProperty dp =
new DependencyProperty(name, propertyType, ownerType,
defaultMetadata, validateValueCallback);
defaultMetadata.Seal(dp, null);
//...Yada yada...
lock (Synchronized)
{
PropertyFromName[key] = dp;
}
के आसपास दोनों टुकड़े केंद्र DependencyProperty.PropertyFromName
, एक HashTable का पंजीयन
पहले जाँच करने के लिए: यह विधि दो भागों है। मैं भी DependencyProperty.RegisteredPropertyList
, एक ItemStructList<DependencyProperty>
देखा लेकिन जहां यह प्रयोग किया जाता है नहीं देखा है। हालांकि, सुरक्षा के लिए, मैंने सोचा कि अगर मैं संभव हो तो उससे भी हटने की कोशिश करूंगा।
तो मैं निम्नलिखित कोड है कि मुझे "अपंजीकृत" करने के लिए एक निर्भरता संपत्ति की अनुमति के साथ समापन।
private void RemoveDependency(DependencyProperty prop)
{
var registeredPropertyField = typeof(DependencyProperty).
GetField("RegisteredPropertyList", BindingFlags.NonPublic | BindingFlags.Static);
object list = registeredPropertyField.GetValue(null);
var genericMeth = list.GetType().GetMethod("Remove");
try
{
genericMeth.Invoke(list, new[] { prop });
}
catch (TargetInvocationException)
{
Console.WriteLine("Does not exist in list");
}
var propertyFromNameField = typeof(DependencyProperty).
GetField("PropertyFromName", BindingFlags.NonPublic | BindingFlags.Static);
var propertyFromName = (Hashtable)propertyFromNameField.GetValue(null);
object keyToRemove = null;
foreach (DictionaryEntry item in propertyFromName)
{
if (item.Value == prop)
keyToRemove = item.Key;
}
if (keyToRemove != null)
propertyFromName.Remove(keyToRemove);
}
यह मेरे लिए "पहले से ही पंजीकृत" अपवाद प्राप्त किए बिना मेरे परीक्षण चलाने के लिए काफी अच्छा काम करता है। हालांकि, मैं दृढ़ता से अनुशंसा करता हूं कि आप किसी भी प्रकार के उत्पादन कोड में इसका उपयोग न करें। संभवतः एक कारण है कि एमएसएफटी ने एक निर्भरता संपत्ति को अपंजीकृत करने का औपचारिक तरीका नहीं चुना है, और इसके खिलाफ जाने का प्रयास सिर्फ परेशानी के लिए है।
बहुत अच्छा! आप सही हैं कि मैं इसे उत्पादन कोड में उपयोग नहीं करना चाहता लेकिन जासूसी कार्य का एक बहुत अच्छा काम! –