मैं अपने कोड में जो समस्या रखता हूं वह इस तरह दिखता है,

public Dictionary<string, int> NumericProperties { get; set; }
public Dictionary<string, string> TextProperties { get; set; }
public Dictionary<string, string[]> CollectionProperties { get; set; }
public Dictionary<string, KeyValue[]> DependencyProperties { get; set; }

public T GetProperty<T>(string name)
{
  //find out which property dictionary and return value
}

सी # में इसे प्रभावी ढंग से करने का कोई तरीका है? एक और विचार मेरे पास एक Dictionary प्रकार का <string, object> बनाना था और इसका उपयोग करना था (मुझे पता है कि कोई भी generic Dictionary प्रकार नहीं है जिसका मैं भी उपयोग कर सकता हूं) और फिर यह केवल एक वस्तु को लौटाने वाला मामला होगा जो अपने मूल प्रकार को खोजने के लिए Pattern Matched हो सकता है।

इस विकल्प के साथ समस्या है boxing और un-boxing चरों के साथ-साथ यह अपनी सामान्य प्रकृति को खो रहा है। मैं एक और विकल्प Property के लिए एक सार आधार वर्ग बनाना है, हालांकि प्रत्येक संपत्ति में एक नाम-मूल्य जोड़ी शामिल होगी और इसलिए generics फिर से आवश्यकता होगी और हम अलग लौटने की कोशिश करने के एक ही मुद्दे में आते हैं Types गतिशील रूप से।

कोई भी सहायताकाफी प्रशंसनीय होगी! धन्यवाद।

0
Tristan Trainer 27 फरवरी 2019, 00:49

1 उत्तर

सबसे बढ़िया उत्तर

आप उपलब्ध शब्दकोशों का शब्दकोश बना सकते हैं। या तो ज्ञात शब्दकोश प्रकारों को मैन्युअल रूप से प्रारंभ करें, या इसे स्वचालित रूप से SetProperty विधि करने दें।

public static Dictionary<Type, object> PropertDicts { get; } = new Dictionary<Type, object>();

public static void SetProperty<T>(string name, T value)
{
    Dictionary<string, T> typedDict;
    if (PropertDicts.TryGetValue(typeof(T), out object dict)) {
        typedDict = (Dictionary<string, T>)dict;
    } else {
        typedDict = new Dictionary<string, T>();
        PropertDicts.Add(typeof(T), typedDict);
    }
    typedDict[name] = value;
}

public static T GetProperty<T>(string name)
{
    if (PropertDicts.TryGetValue(typeof(T), out object dict)) {
        var typedDict = (Dictionary<string, T>)dict;
        if (typedDict.TryGetValue(name, out T value)) {
            return value;
        }
    }
    return default(T);
}

लेकिन जेनरिक तभी काम करते हैं जब आप किसी संपत्ति के प्रकार को पहले से जानते हों। पूरी तरह से गतिशील परिदृश्यों के लिए जेनरिक बेकार हैं।

0
Olivier Jacot-Descombes 26 फरवरी 2019, 22:31