c#继承字典覆盖默认属性

时间:2013-10-28 22:12:30

标签: c# inheritance dictionary

我正在尝试创建一个继承自Dictionary的类。

例如:

var retDict = new Dictionary<string,string>();
然后我就可以打电话了 retDict [“test”]获取带有“test”键的项目。

我想要做的是在retDict上有一个方法,我这样称呼它。 retDict [“test”,“默认返回值”];

如果找不到密钥,我希望这种方法在基本字典中创建一个项目。

这可能吗?如果有可能,我该如何编写此方法/“peroperty get”?

最诚挚的问候。 /丹尼斯

[编辑]

这就是我写它的方式VB.NET。

Public Class MyDictionary Inherits System.Collections.Generic.Dictionary(Of String, String)

Default Public Overloads Property Item(ByVal key As String, Optional DefaultValue As String = "") As String
    Get
        If Not MyBase.ContainsKey(key) Then
            If DefaultValue <> "" Then
                MyBase.Add(key, DefaultValue)
            Else
                Return ""
            End If
        End If
        Return MyBase.Item(key)
    End Get
    Set(ByVal value As String)
        MyBase.Item(key) = value
    End Set
End Property

Default Public Overloads Property Item(ByVal key As String, Optional DefaultValue As String = "") As String Get If Not MyBase.ContainsKey(key) Then If DefaultValue <> "" Then MyBase.Add(key, DefaultValue) Else Return "" End If End If Return MyBase.Item(key) End Get Set(ByVal value As String) MyBase.Item(key) = value End Set End Property

2 个答案:

答案 0 :(得分:1)

基类库中的Dictionary类不直接提供此类。您可以改为使用ConcurrentDictionary<T,U>,它提供了提供此功能的GetOrAdd方法,或通过扩展方法实现您自己的方法。

public static U GetOrAdd<T,U>(this Dictionary<T,U> dict, T key, U value)
{
    U val;
    if (dict.TryGetValue(key, out val))
         return val;

    dict[key] = value;
    return value;
}

这不会像你描述的那样 - 而是你会这样做:

var val = retDict.GetOrAdd("test", "the default value");

这种方法的优点是它不需要创建自定义类(只是一个扩展方法)并匹配BCL API(即:ConcurrentDictionary<T,U>.GetOrAdd)。

如果您想制作自定义课程,当然可以通过indexer来处理:

public TValue this[TKey key, TValue defaultValue]
{
    get
    {
        TValue val;
        if (this.TryGetValue(key, out val))
             return val;

        this[key] = defaultValue;
        return defaultValue;
    }
}

答案 1 :(得分:-3)

应该是沿线的(在浏览器中编码,所以没有调试......) 不是真正的覆盖,但很容易实现...... 我稍后会尝试进入真正的覆盖

 private string _Value;
    public string GetValue(string KeyName, string sDefault)
    {

        if (_Value.Length == 0)
        {
            return sDefault;
        }
        else
        {
            return sDefault; ;
        }
    }