有没有一种方法可以从一组具有不同值类型的字典中一般地返回值?

时间:2019-02-26 21:49:33

标签: c# generics pattern-matching

我不断在代码中碰到的问题看起来像这样,

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
}

在C#中是否有一种有效的方法?我的另一种想法是创建一个Dictionary类型的<string, object>并使用它(我知道我也可以使用generic Dictionary类型),然后返回对象可能是Pattern Matched来查找其原始类型,这只是一个简单的情况。

此选项的问题是变量boxingun-boxing以及失去其通用性。我的另一种选择是为Property创建一个抽象基类,但是由于每个属性都将由一个名称-值对组成,因此将再次需要generics,我们陷入了试图返回不同值的同一问题Types动态地。

任何帮助将不胜感激!谢谢。

1 个答案:

答案 0 :(得分:0)

您可以创建可用字典的字典。手动初始化已知的字典类型,或者让它自动执行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);
}

但是泛型仅在您知道高级属性的类型时才起作用。对于完全动态的场景,泛型是没有用的。