繁体   English   中英

在C#中具有字典的获取器和设置器

[英]getters and setters with dictionary in c#

我有以下家长课:

public class BaseType
{ 
   public abstract Dictionary<string, object> dict { get; set; }
}

子班:

public override Dictionary<string, object> dict
{
   get 
   {
      return fn(); 
   }
   set
   {
      //set dictionary[key]=value }
   }

fn在子类中的实现方式为:

public static Dictionary<string, object> fn()
{
   Dictionary<string, object> dictionary = new Dictionary<string, object>();
   dictionary.Add("key1", "0");
   dictionary.Add("key2", "something");
   return dictionary;
}

我需要按以下方式访问此dictionary

BaseType test=new Child();
test.dict["key1"]=1;//set property
object strGet= test.dict["key2];//get property

如何实现以上获取和设置?

您的父班已经无效。 您不能具有接受参数的属性。

您只能将字典公开为属性本身。 请注意,您还需要使类抽象:

public abstract class BaseType
{
    public abstract Dictionary<string, object> Dict { get; set; }
}

然后,在该类的子类型中,可以设置getter和setter,以便它返回一个自定义词典:

public class MyType : BaseType
{
    public override Dictionary<string, object> Dict
    {
        get
        {
            return GetSomeDictionary();
        }
        set
        {
            DoSomethingWith(value);
        }
    }
}

注意,这不允许您在执行someObj.Dict["key"] = "foo"时覆盖行为。 项目访问器内置在字典类型中,您不能从类中覆盖它。

您可以做的是公开一个IDictionary<string, object>然后提供您自己的类型,该类型可以包装普通字典,但可以公开所需的行为。


如果您的代码的全部目的只是为字典提供一些默认值,那么您可以轻松解决此问题:

public class MyType : BaseType
{
    private Dictionary<string, object> _dict = null;

    public override Dictionary<string, object> Dict
    {
        get
        {
            if (_dict == null)
            {
                _dict = InitializeDictionary();
            }
            return _dict;
        }
        set
        {
            _dict = value;
        }
    }
}

其中InitializeDictionary()返回具有默认值的新字典。

我知道了!! 这样,我们可以动态设置字典中任何键的值。

public object objValue;
public string strKey;
public override Dictionary<string, object> dictionary
    {
        get
        {
           return fn(); 
        }
        set 
        {
            setTest(strKey,objValue);
        }
    }

    public void setTest(string strKey, object objValue)
    {
        dictionary[strKey] = objValue;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM