c#中带有dictionary的getter和setter

本文关键字:getter setter dictionary | 更新日期: 2023-09-27 18:22:46

我有以下父类:

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

我该如何实现上述获取和设置?

c#中带有dictionary的getter和setter

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

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

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;
    }