अगर मैं सही ढंग से समझ, आप सामान्य प्रकार है, जहां सामान्य प्रकार पैरामीटर भिन्न हो सकते हैं का एक संग्रह स्टोर करने के लिए कोशिश कर रहे हैं:
यहाँ गैर सामान्य तरीका है। यदि यह मामला है, यह सीधे संभव नहीं है, जैसा कि निम्न उदाहरण दिखाता है:
// You have lists of different types:
List<double> doubleCollection = new List<double>();
List<string> stringCollection = new List<string>();
// Now to store generically:
var collection = new List<List< /* ... Which type parameter to use? ... */ >>();
क्या यहाँ स्पष्ट होना चाहिए, कि यह संभव किस प्रकार पैरामीटर का उपयोग करने निकालना नहीं है। इसके बजाय (अपने उदाहरण के संबंध में), तो आप इस बजाय की तरह कुछ कर सकते हैं:
public interface IOperand
{
}
public interface IOperand<T>
{
}
public interface IOperandFactory
{
IOperand CreateEmptyOperand();
IOperand CreateOperand(object value);
}
public interface IOperandFactory<T> : IOperandFactory
{
new IOperand<T> CreateEmptyOperand();
IOperand<T> CreateOperand(T value);
}
public class DoubleFactory : IOperandFactory<double>
{
public IOperand<double> CreateEmptyOperand()
{
throw new NotImplementedException();
}
public IOperand<double> CreateOperand(double value)
{
throw new NotImplementedException();
}
IOperand IOperandFactory.CreateEmptyOperand()
{
throw new NotImplementedException();
}
public IOperand CreateOperand(object value)
{
throw new NotImplementedException();
}
}
public class SomeContainer
{
public SomeContainer()
{
var factoryDict = new Dictionary<Type, IOperandFactory>()
{
{ typeof(double), (IOperandFactory)new DoubleFactory() }
};
}
}
इस समाधान के सबसे खूबसूरत नहीं हो सकता है, लेकिन यह आप एक ही संग्रह में विभिन्न सामान्य प्रकार के स्टोर करने के लिए अनुमति होगी। हालांकि, इसके साथ एक मुद्दा यह है कि इस तरह के संग्रह तक पहुंचने वाले कॉलर को यह जानने की आवश्यकता होगी कि किस प्रकार कास्ट करना है। उदाहरण के लिए:
// ... Inside SomeContainer ...
public IOperandFactory<T> GetFactory<T>()
{
return (IOperandFactory<T>)factoryDict[typeof(T)];
}
तो इस के साथ, आप DoubleFactory
का उपयोग कर प्राप्त कर सकते हैं:
IOperandFactory<double> doubleFactory = mSomeContainerInstance.GetFactory<double>();
IOperand<double> emptyOperand = doubleFactory.CreateEmptyOperand();
IOperand<double> filledOperand = doubleFactory.CreateOperand(1.0d);
स्रोत
2012-01-16 09:11:32
त्वरित जवाब के लिए धन्यवाद। – Danil
@Danil I ने एक पूर्ण उदाहरण में संपादित किया, अगर यह –
हाँ मदद करता है, धन्यवाद, मुझे लगता है कि यह अन्य उपयोगकर्ताओं के लिए भी उपयोगी होगा। – Danil