2015-08-14 9 views
6

इसी प्रकार का प्रश्न: Passing int list as a parameter to a web user control
क्या एनम प्रकार के लिए कोई समान उदाहरण है?

मैं एक एएसपीनेट कस्टम नियंत्रण बना रहा हूं जिसमें मैं संपत्ति के रूप में एम्स की अलग-अलग सूची को पास करना चाहता हूं।
मैं एमा की सूची में अल्पविराम से अलग स्ट्रिंग मानों को परिवर्तित करने के लिए TypeConverter लिख रहा हूं।

ConvertTo विधि में,
एनम की सूची के लिए InstanceDescriptor ऑब्जेक्ट कैसे बनाएं?

मेरे वर्तमान कोड इस प्रकार है:enum की सूची के लिए InstanceDescriptor कैसे बनाएं?

//enum 
public enum MyEnum {Hello, World} 

//main method 
List<MyEnum> list = new List<MyEnum>(); 
list.Add(MyEnum.Hello); 
list.Add(MyEnum.World); 
ConstructorInfo constructor = typeof(List<MyEnum>).GetConstructor(Type.EmptyTypes); 
InstanceDescriptor idesc = new InstanceDescriptor(constructor, list); 

यह संदेश

Length mismatch 

मुझे आश्चर्य के साथ विफल क्यों

उत्तर

2

"लंबाई बेमेल" त्रुटि होती है क्योंकि आप default List<T> constructor, जो शून्य तर्क पुनः प्राप्त, और फिर आप InstanceDescriptor पूछना दो तर्क, MyEnum.Hello और MyEnum.World साथ कि निर्माता कॉल करने के लिए।

आप alternate List<T> constructor है कि एक ही IEnumerable<T> तर्क स्वीकार करता है इस्तेमाल कर सकते हैं कि लगता है कि हो सकता है:

ConstructorInfo constructor = 
    typeof(List<MyEnum>).GetConstructor(new[] { typeof(IEnumerable<MyEnum>) }); 
InstanceDescriptor idesc = new InstanceDescriptor(constructor, new[] { list }); 

यह InstanceDescriptor खुश करता, लेकिन दुर्भाग्य से, आप पाएंगे कि ASP.NET बजाय अब NullReferenceException फेंकता है (के रूप में ही question you linked to में) क्योंकि एएसपी.नेट को पता नहीं है कि IEnumerable<T> पैरामीटर से कैसे निपटें।

समस्या को हल करने के दो तरीके यहां दिए गए हैं।

समाधान 1: अपने कस्टम नियंत्रण और MyEnum[] बजाय List<MyEnum> उपयोग करने के लिए अपने प्रकार कनवर्टर बदलें। यह काम करता है क्योंकि एएसपी.नेट एरे को संभाल सकता है।

समाधान 2:

public static List<MyEnum> ToList(MyEnum[] values) 
{ 
    return new List<MyEnum>(values); 
} 

फिर एक InstanceDescriptor कि सहायक प्रणाली को बुलाती है, यह एक के रूप में अपनी सूची गुजर बनाने के लिए अपने प्रकार कनवर्टर बदलने के लिए: एक स्थिर सहायक विधि है कि एक सरणी से एक List<MyEnum> बनाता बनाएं सरणी:

MethodInfo method = typeof(MyEnumListConverter).GetMethod("ToList"); 
InstanceDescriptor idesc = new InstanceDescriptor(method, new[] { list.ToArray() }); 
2

आपकी सूची एक खाली संग्रह होना चाहिए क्योंकि constructor parameterless constructor है आपका कोड इस तरह दिखना चाहिए:

List<MyEnum> list = new List<MyEnum>(); 
ConstructorInfo constructor = typeof(List<MyEnum>).GetConstructor(Type.EmptyTypes); 
InstanceDescriptor idesc = new InstanceDescriptor(constructor, list); 

या एक अशक्त constructor का उपयोग करें:

ConstructorInfo constructor = 
    typeof(List<MyEnum>).GetConstructor(BindingFlags.ExactBinding, null,Type.EmptyTypes, null); 

इसका मतलब है कि: EmptyTypes क्षेत्र GetConstructor तरीकों में से एक में इस्तेमाल एक constructor कि कोई पैरामीटर लेता है पाने के लिए।

+0

यह रिटर्न शून्य 'निर्माता' ऑब्जेक्ट –

+1

मेरा अद्यतन उत्तर जांचें। –

संबंधित मुद्दे