2011-06-07 15 views
6

मेरे पास कोड का एक हिस्सा है जहां कभी-कभी मुझे एक नया जेनेरिक प्रकार बनाने की आवश्यकता होती है, लेकिन सामान्य पैरामीटर की अज्ञात संख्या के साथ। उदाहरण के लिए:कई प्रकार के साथ जेनेरिक बनाना

public object MakeGenericAction(Type[] types) 
{ 
    return typeof(Action<>).MakeGenericType(paramTypes); 
} 

समस्या यह है कि यदि मेरे सरणी में एक से अधिक प्रकार हैं, तो प्रोग्राम क्रैश हो जाएगा। अल्प अवधि में मैं इस तरह कुछ स्टॉप-गैप के रूप में आया हूं।

public object MakeGenericAction(Type[] types) 
{ 
    if (types.Length == 1) 
    { 
    return typeof(Action<>).MakeGenericType(paramTypes); 
    } 
    else if (types.Length ==2) 
    { 
    return typeof(Action<,>).MakeGenericType(paramTypes); 
    } 
    ..... And so on.... 
} 

यह काम करता है, और मेरे परिदृश्य को कवर करने में काफी आसान है, लेकिन यह वास्तव में हैकी लगता है। क्या इसे संभालने का कोई बेहतर तरीका है?

उत्तर

5

उस मामले में, हाँ:

Type actionType = Expression.GetActionType(types); 

समस्या यहाँ यह है कि आप शायद DynamicInvoke जो धीमी है का उपयोग किया जाएगा।

एक Action<object[]> तो सूचकांक द्वारा उपयोग एक Action<...> DynamicInvoke के साथ आमंत्रण को मात कर सकते हैं

+1

सुंदर, सुरुचिपूर्ण समाधान (या कम से कम प्रतिबिंबित जेनेरिक हो सकता है) – KeithS

+1

बहुत अच्छा। यदि आपके सरणी में 16 से अधिक प्रकार थे तो क्या होगा? आपके द्वारा सभी इलेक्ट्रॉनिक उपकरणों को हटाने वाली पुलिस पुलिस के अलावा। – IndigoDelta

+0

@IndigoDelta cogs बाहर गिर जाएगा; पी –

0
Assembly asm = typeof(Action<>).Assembly; 
Dictionary<int, Type> actions = new Dictionary<int, Type>; 
foreach (Type action in asm.GetTypes()) 
    if (action.Name == "Action" && action.IsGenericType) 
     actions.Add(action.GetGenericArguments().Lenght, action) 

तो आप actions शब्दकोश का उपयोग कर सकते जल्दी से सही प्रकार खोजने के लिए:

public Type MakeGenericAction(Type[] types) 
{ 
    return actions[types.Lenght].MakeGenericType(paramTypes); 
} 
संबंधित मुद्दे