【问题标题】:getters and setters with dictionary in c#c#中带有字典的getter和setter
【发布时间】:2015-11-24 20:00:45
【问题描述】:

我有以下父类:

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

如何实现上面的get和set?

【问题讨论】:

  • 请编写有效的 c# 代码。在你的基类中是那个属性吗?或方法?为什么要抽象?
  • test.dict["key1"] 仍然使用属性 dictget 部分。你似乎根本没有使用set。然而,get { return fn(); } 总是返回一个 new 实例!所以对于test.dict["key1"] = 1; object obj = test.dict["key1"]obj 将是"0",因为将"key1" 的值设置为1 的字典丢失了。
  • @pika 当你删除你的答案时我再次在这里发表我的评论:我仍然建议你澄清你的问题,因为从你的答案看来,你的意思与他们的来历不同结束你的问题。

标签: c# .net


【解决方案1】:

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

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

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&lt;string, object&gt;,并提供您自己的类型,该类型包装普通字典,但公开您想要的行为。


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

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() 返回具有默认值的新字典。

【讨论】:

  • 如何动态提供“价值”?
  • 使用set,您总是有一个value,它代表您要将属性设置为的值。 -- 基本上setpublic [propertyname]_set([propertytype] value){ /* body of set */ } 的语法糖
【解决方案2】:

我明白了!!这样我们就可以动态设置字典中任意键的值。

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

【讨论】:

  • dictionary.set 中,strKey 是什么,objValue 是什么(换句话说,它们在哪里定义,它们是什么值)?您也忽略了给setvalue。从您这里的内容中,我看不出这是如何回答您自己的问题的。
  • strKey 和 objValue 似乎是同一类中的其他变量,但奇怪的是............value 完全被完全忽略,这就是 set 被赋予参数的方式。因此,“set”没有正常的功能。相反,它设置了一个名为 param 的数组或字典,之前从未提到过......,不确定这是关于什么,但问题或答案有问题,或者很可能两者都有问题 oO
  • @pika 我放了一个-1,直到你在问题或答案或两者中清除那里的东西,这样事情才有意义
  • @pika 正如我提到的那样; 1.设置一个从未在任何地方提及的变量参数(不在您的问题中,不在此答案中)。这使得这个答案对于任何阅读它的人来说都是不完整的。
  • 2.您正在使用普通的 set 属性,但是您忽略了它自动具有的 value 参数,这很奇怪,您没有给出任何理由。例如stackoverflow.com/questions/11583595/… value 参数也有字典的键和值: Set(value.Key, value.Value);因此,您对 objValue, strKey 的使用也没有显示它们是如何设置的,或者至少没有给出任何评论为什么使用它们表明不完整,因为其他读者无法理解您为什么使用它们而不是 value。
猜你喜欢
  • 2022-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-03
  • 2010-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多