2012-09-02 36 views
71

तो मेरे पास है:ऑब्जेक्ट को अपने वास्तविक प्रकार में कैसे डाला जाए?

void MyMethod(Object obj) { ... } 

कैसे मैं क्या इसकी वास्तविक प्रकार है करने के लिए obj डाली कर सकते हैं? आप वास्तविक प्रकार, जानते हैं तो बस

void MyMethod(Object obj) { 
    ActualType actualyType = (ActualType)obj; 
} 
+2

क्या संकलन समय पर ज्ञात प्रकार है? – psubsee2003

+1

और आप इससे क्या हासिल करने की उम्मीद करते हैं? कृपया हमें बताएं कि आप इसे प्राप्त करने की अपेक्षा करने के बजाय, आप क्या हासिल करने की कोशिश कर रहे हैं। –

+0

@ जोनस्केट: मैं ऑब्जेक्ट से फ़ंक्शन कॉल करने में सक्षम होना चाहता हूं। वर्तमान में 'obj.MyFunction();' संकलित नहीं करता है, भले ही मुझे पता है कि वास्तविक वस्तु में वह कार्य है। –

उत्तर

117

:

SomeType typed = (SomeType)obj; 
typed.MyFunction(); 

आप वास्तविक प्रकार पता नहीं है, तो:

+0

स्विफ्ट में समकक्ष वाक्यविन्यास क्या है? – Rao

+1

कभी भी नहीं, टाइपकास्टिंग के लिए 'as'' और उदाहरण प्रकार की जांच करने के लिए 'प्रकार (क्लासनाम)' फ़ंक्शन मिला। – Rao

0

वास्तविक प्रकार के लिए कास्टिंग के लिए आसान है वास्तव में नहीं, नहीं।

// reflection 
obj.GetType().GetMethod("MyFunction").Invoke(obj, null); 

// interface 
IFoo foo = (IFoo)obj; // where SomeType : IFoo and IFoo declares MyFunction 
foo.MyFunction(); 

// dynamic 
dynamic d = obj; 
d.MyFunction(); 
+4

यह बहुत मजेदार है ... – Steve

+1

यह अजीब है। आप वास्तव में वास्तविक प्रकार को नहीं जानते हैं। आपको ऐसा कैसे करना चाहिए? –

28

मुझे नहीं लगता कि:

  • प्रतिबिंब
  • को लागू करने के एक प्रसिद्ध इंटरफ़ेस
  • गतिशील

उदाहरण के लिए: आप के बजाय एक का उपयोग करने के लिए होगा आप (प्रतिबिंब के बिना नहीं) कर सकते हैं, आपको अपने फ़ंक्शन में एक प्रकार भी प्रदान करना चाहिए:

void MyMethod(Object obj, Type t) 
{ 
    var convertedObject = Convert.ChangeType(obj, t); 
    ... 
} 

युपीडी:

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

void MyMethod(Object obj) 
{ 
    if (obj is A) 
    { 
     A a = obj as A; 
     ... 
    } 
    else if (obj is B) 
    { 
     B b = obj as B; 
     ... 
    } 
} 
+1

यह वास्तव में एक बेकार जवाब है, अप-वोटों के अयोग्य। ऑब्जेक्ट के ऑब्जेक्ट का प्रतिबिंब ओपी द्वारा पूछे गए ऑब्जेक्ट के "वास्तविक प्रकार" को नहीं देगा। साथ ही, आपका MyMethod तर्क त्रुटिपूर्ण है क्योंकि obj टाइप ए का हो सकता है और यह भी प्रकार बी का हो सकता है। आपका तर्क "वास्तविक प्रकार" (ओपी अनुरोध के रूप में) प्रदान नहीं करता है - यह एक संगत प्रकार प्रदान करता है, और जरूरी नहीं वांछित प्रकार उस पर। – Jazimov

0
Implement an interface to call your function in your method 
interface IMyInterface 
{ 
void MyinterfaceMethod(); 
} 

IMyInterface MyObj = obj as IMyInterface; 
if (MyObj != null) 
{ 
MyMethod(IMyInterface MyObj); 
} 
0

अपने MyFunction() विधि केवल एक वर्ग (और उसके वंश) में परिभाषित किया गया है, तो कोशिश

void MyMethod(Object obj) 
{ 
    var o = obj as MyClass; 
    if (o != null) 
     o.MyFunction(); 
} 

यदि आप समारोह आप कॉल करना चाहते परिभाषित करने असंबंधित कक्षाओं में एक बड़ी संख्या है, तो आप एक इंटरफेस को परिभाषित करने और अपनी कक्षाओं कि इंटरफेस को परिभाषित करना चाहिए है:

interface IMyInterface 
{ 
    void MyFunction(); 
} 

void MyMethod(Object obj) 
{ 
    var o = obj as IMyInterface; 
    if (o != null) 
     o.MyFunction(); 
} 
0

अपनी असली प्रकार के कास्ट यह अगर तुम अब उदाहरण के लिए प्रकार यह एबीसी नाम की कक्षा से उन्मुख है। आप इस तरीके से अपने फ़ंक्शन को कॉल कर सकते हैं:

(abc)(obj)).MyFunction(); 

अगर आप समारोह में यह एक अलग तरीके से किया जा सकता है पता नहीं है। हमेशा आसान नहीं है। लेकिन आप इसे किसी हस्ताक्षर से किसी भी तरह से पा सकते हैं। यदि यह आपका मामला है, तो आपको हमें बताना चाहिए।

0

मेरे मामले में ऑटोमैपर अच्छी तरह से काम करता है।

AutoMapper किसी भी स्पष्ट विन्यास के बिना गतिशील वस्तुओं से/मैप कर सकते हैं:

public class Foo { 
    public int Bar { get; set; } 
    public int Baz { get; set; } 
} 
dynamic foo = new MyDynamicObject(); 
foo.Bar = 5; 
foo.Baz = 6; 

Mapper.Initialize(cfg => {}); 

var result = Mapper.Map<Foo>(foo); 
result.Bar.ShouldEqual(5); 
result.Baz.ShouldEqual(6); 

dynamic foo2 = Mapper.Map<MyDynamicObject>(result); 
foo2.Bar.ShouldEqual(5); 
foo2.Baz.ShouldEqual(6); 

इसी तरह आप शब्दकोशों से सीधे मैप कर सकते हैं वस्तुओं के लिए, AutoMapper संपत्ति नामों के साथ कुंजी लाइन अप होगा।

अधिक जानकारी https://github.com/AutoMapper/AutoMapper/wiki/Dynamic-and-ExpandoObject-Mapping