2009-09-12 11 views
10

मैं कैसल DynamicProxy उपयोग कर रहा हूँ हो रही है और मेरे ViewModels एक प्रॉक्सी, कुछ इस तरह हैं:एक प्रॉक्सी वस्तु की मूल प्रकार

 
namespace MyApplication.ViewModels 
{ 
    public class MyViewModel : BaseViewModel, IMyViewModel 
    { 
    } 
} 

मेरी viewmodel के एक प्रॉक्सी इस तरह दिखता है, हालांकि:

{नाम = "IRootViewModelProxyffecb133f590422098ca7c0ac13b8f98" FullName = "IRootViewModelProxyffecb133f590422098ca7c0ac13b8f98"}

मैं वास्तविक प्रकार या वास्तविक प्रकार है कि प्रॉक्सी होने का नाम स्थान प्राप्त करना चाहते हैं। क्या इसे करने का कोई तरीका है? मुझे ऐसा कुछ चाहिए जो MyApplication.ViewModels.MyViewModel प्रकार देता है। यदि मैं प्रॉक्सी के रूप में कंक्रीट क्लास का उपयोग कर रहा हूं, बेसटाइप वास्तविक वर्ग को वापस लाता है जिसे प्रॉक्सी किया जा रहा है, लेकिन इंटरफ़ेस का उपयोग करते समय बेसटाइप सिस्टम लौटाएगा। ऑब्जेक्ट।

उत्तर

15

यह आप वास्तविक प्रकार प्राप्त करने के लिए निम्न कर सकते हैं लगता है:

 
(proxy As IProxyTargetAccessor).DynProxyGetTarget().GetType() 
+1

हां, यही रास्ता है। हालांकि, हालांकि, प्रॉक्सी के पास कोई लक्ष्य नहीं है, तो DynProxyGetTarget() शून्य वापस आ सकता है। –

5

आप एक वर्ग और नहीं एक इंटरफेस को प्रॉक्सी रहे हैं, तो आप इस तरह अंतर्निहित प्रकार प्राप्त कर सकते हैं:

var unproxiedType = ProxyUtil.GetUnproxiedType(proxy); 

यदि आपके पास प्रॉक्सीयूट तक पहुंच नहीं है तो यह भी काम करेगा:

private static Type GetUnproxiedType(object source) 
{ 
    var proxy = (source as IProxyTargetAccessor); 

    if (proxy == null) 
    return source.GetType(); 

    return proxy.GetType().BaseType;    
} 
+0

हाँ, हालांकि यह वर्ग विंडसर का हिस्सा है डायनेमिक प्रॉक्सी नहीं, इसलिए यह हमेशा उपलब्ध नहीं है –

+0

क्रज़िज़टॉफ ने सुझाव दिया कि पहला समाधान उन उपयोगकर्ताओं के लिए काम नहीं करेगा जो कैसल विंडसर का उपयोग नहीं करते हैं, इसलिए मैंने जवाब संशोधित किया। –

+2

बीटीडब्ल्यू मुझे लगता है कि 'प्रॉक्सीयूटिल' डीपी में एक उपयोगी चीज हो सकती है, इसलिए मैं इसे अगले संस्करण के लिए विंडसर से डायनामिकप्रॉक्सी तक पोर्ट कर दूंगा। –