2010-08-09 12 views
18

में कनवर्ट करें I am अटक गया है।एक्शन <T> एक्शन <object>

मैं Action<T> to an Action<Object> को सी # में कैसे परिवर्तित करूं?

सादर मैगनस

+5

प्रश्न यह नहीं समझता है कि आप कोई कार्रवाई नहीं बना सकते हैं, आपको एक प्रकार निर्दिष्ट करना होगा। –

+1

उन covariance/contravariance प्रश्नों में से एक का अनुमान लगाया, अन्यथा जवाब 'एक्शन ' होगा। –

+2

जब तक टी कक्षा तक सीमित नहीं है, तब तक आप ऑब्जेक्ट में एक खुले जेनेरिक प्रकार नहीं डाल सकते हैं। कोड में, एक्शन एक्शन को असाइन किया गया है जब टी: कक्षा। स्टीवन, बस इसे स्पष्ट करने के लिए शायद covariance द्वारा हल करने योग्य नहीं है। – Dykam

उत्तर

34

यहाँ तुम क्या के लिए पूछने का एक नमूना है (अंतिम पंक्ति में जोड़ा जा सकता है प्रकार की जांच ठीक से अवैध डाली अपवाद को संभालने के लिए होने के लिए और अधिक उपयोगकर्ता के अनुकूल):

public Action<object> Convert<T>(Action<T> myActionT) 
{ 
    if (myActionT == null) return null; 
    else return new Action<object>(o => myActionT((T)o)); 
} 

हो सकता है आप के बारे में अधिक जानकारी दे सकते हैं हालांकि कार्य, क्योंकि अभी यह थोड़ा अजीब लग रहा है।

+0

धन्यवाद मैं बाद में इसका परीक्षण करूंगा। –

+0

यह काम करता है। धन्यवाद। :-) – Fanda

+1

वाह अद्भुत। धन्यवाद ब्रो: डी – brian

0

सुनिश्चित नहीं हैं कि परिवर्तित करके क्या मतलब है ... लड़ाई एक कार्रवाई प्रतिनिधि के जेनेरिक घोषणा है ... यदि आप एक कार्रवाई प्रतिनिधि है कि 'वस्तु' पर काम करता है चाहते हैं आप की तरह कुछ करना होगा :

var myAction = new Action<object>(obj=> ...); 
0

मुझे लगता है आप कुछ इस तरह है:

void Foo(Action<object> action) { } 

Action<something> myaction; 

और myaction कन्वर्ट करने के लिए ताकि आप इसे फू करने के लिए पारित कर सकते हैं चाहता हूँ।

यह काम नहीं करता है।

फू किसी ऑब्जेक्ट को उस क्रिया से पास कर सकता है जिसका प्रकार ऑब्जेक्ट से प्राप्त होता है। लेकिन रहस्य केवल उन वस्तुओं को स्वीकार करता है जो कुछ से प्राप्त होते हैं।

0

मैं आज ऐसा करने का एक तरीका ढूंढ रहा था और इस पोस्ट पर ठोकर खा रहा था। असल में, मुझे ऐसा करने का एकमात्र आसान तरीका एक्शन < स्ट्रिंग > को एक नई एक्शन < ऑब्जेक्ट > में लपेटना था। मेरे मामले में, मैं अपनी क्रियाओं को एक समवर्ती शब्दकोश में दबा रहा था, और फिर उन्हें प्रकार से पुनर्प्राप्त कर रहा था। प्रभावी रूप से, मैं संदेशों की एक कतार संसाधित कर रहा था जहां विशेष टाइप किए गए इनपुट वाले संदेशों को संभालने के लिए क्रियाओं को परिभाषित किया जा सकता था।

var _actions = new ConcurrentDictionary<Type, Action<object>>(); 
Action<string> actionStr = s => Console.WriteLine(s); 
var actionObj = new Action<object>(obj => { var castObj = (V)Convert.ChangeType(obj, typeof(V)); actionStr(castObj); }); 
_actions.TryAdd(typeof(string), actionObj); 
संबंधित मुद्दे