मैं प्रतिबिंब का उपयोग करके एक सरणी बनाने की कोशिश कर रहा हूं, और इसमें मान डाल सकता हूं। ,सी # ऐरे के लिए रनटाइम पर कास्टिंग टाइप करें। SetValue
public class A{
public A(){}
private double val;
public double Value{
get{ return val; }
set{ this.val = value; }
}
public static implicit operator A(double d){
A a = new A();
a.Value = d;
return a;
}
}
और वर्ग बी बहुत समान होने: वर्ग के साथ एक से किया जा रहा
String propertyName1 = "prop1";
String propertyName2 = "prop2";
Type t1 = typeof(myType).getProperty(propertyName1).PropertyType.getElementType();
Type t2 = typeof(myType).getProperty(propertyName2).PropertyType.getElementType();
double exampleA = 22.5;
int exampleB = 43;
Array arrA = createAndFillArray(t1, exampleA);
Array arrB = createAndFillArray(t2, exampleB);
private Array createAndFillArray(Type t, object val){
Array arr = Array.CreateInstance(t, 1); //length 1 in this example only, real-world is of variable length.
arr.SetValue(val, 0); //this causes the following error: "System.InvalidCastException : Object cannot be stored in an array of this type."
return arr;
}
इस प्रकार है: मैं तो एक createAndFillArray
समारोह इस में सक्षम चाहते हैं कई अलग अलग प्रकार के लिए यह करने के लिए कोशिश कर रहा हूँ लेकिन int
साथ:
public class B{
public B(){}
private double val;
public double Value{
get{ return val; }
set{ this.val = value; }
}
public static implicit operator B(double d){
B b = new B();
b.Value = d;
return b;
}
}
और MyType निम्नलिखित की तरह कुछ है
public class myType{
public A prop1{ get; set; }
public B prop2{ get; set; }
}
मुझे उम्मीद थी कि निहित ऑपरेटर यह सुनिश्चित करेगा कि डबल को कक्षा ए में परिवर्तित किया जाए, या कक्षा बी से int, और त्रुटि से बचा जाए; लेकिन यह स्पष्ट रूप से ऐसा नहीं है।
उपर्युक्त कस्टम deserialization वर्ग में उपयोग किया जाता है, जो एक कस्टम डेटा प्रारूप से डेटा लेता है और संबंधित .Net ऑब्जेक्ट गुणों में भरता है। मैं प्रतिबिंब और रनटाइम के माध्यम से ऐसा कर रहा हूं, इसलिए मुझे लगता है कि दोनों अपरिहार्य हैं। मैं सी # 2.0 ढांचे को लक्षित कर रहा हूं।
मैं दर्जनों, नहीं तो सैकड़ों, A
और B
के समान वर्गों की है, तो एक समाधान है जो एक समाधान है जो इन कक्षाओं में बदल बजाय createAndFillArray
विधि में सुधार को खोजने के लिए पसंद करेंगे।
क्यों का उपयोग कर नहीं है 'सार्वजनिक दसवीं कक्षा' एक ही कक्षा के बजाय सिर्फ विभिन्न सदस्य प्रकार:
से कॉपी किया गया? –
[लागू रूपांतरणों को संकलन समय पर हल किया जाना चाहिए।] (Http://philosopherdeveloper.wordpress.com/2010/05/05/the-difference-between-converting-and-unboxing-read-my-mind-compiler /) एक अनबॉक्सिंग ऑपरेशन जादुई रूप से एक निहित रूपांतरण नहीं करेगा जब संकलक समय से पहले के प्रकारों को नहीं जानता था। एक ही नियम सभी विधि अधिभार संकल्प मामलों पर लागू होता है। –
@ सईद यह सबसे अच्छा होगा, लेकिन दुर्भाग्य से कक्षाएं ए, बी, सी आदि .. विरासत हैं और मैं उन्हें बदलने के बारे में जाने के लिए बहुत अनिच्छुक हूं। –