C# 变量 getter / setter

标签 c#

我正在尝试为外部程序创建一种简单的方法来获取/设置我的类中的变量。我拥有的是一个包含多个变量的类,例如:

class myClass
{
    public int one
    {
        get{ /* get code here */ }
        set{ /* set code here */ }
    }
}

我有将近 100 个变量,而不仅仅是变量“一”。所有设置都以相同的方式使用获取和设置代码。我想要的是一种获取和设置变量的简单方法。示例:不必这样做:

myClass c = new myClass();
c.one = 5;

我想找到一种方法来做类似的事情:

myClass c = new myClass();
c.setVariable("variableName", value);

“variableName”文本最好来自枚​​举列表,这样它们就可以像这样被引用:

c.setVariable(enumName.varName, value);

我不确定该怎么做,或者是否有可能。正如我所说,我有将近 100 个变量需要它们自己的获取/设置代码,但出于各种原因,我宁愿只有一个公共(public)获取函数和一个公共(public)设置函数。

因为我认为反射不是很有效,所以我想尽可能避免它。

我在 C# 中看到其他代码使用了类似这样的东西:

this["variableName"] = value;

但是我似乎也找不到一种方法来完成这项工作......

最佳答案

this["variableName"] = value;

您描述的语法仅对字典有效。如果你不想使用反射而只想要一个 getter 和 setter,你也许应该使用字典。 编辑:你知道lambda expressions吗? ?它们是内联匿名方法,通过将它们放在另一个字典中,您可以进行验证!像这样:

public class MyClass
{
    private readonly Dictionary<String, Object> dictionary;
    private readonly Dictionary<String, Func<Object, bool>> validators;

    public MyClass()
    {
        this.dictionary = new Dictionary<String, Object>();
        this.validators = new Dictionary<String, Func<Object, bool>>();

        // Put the default values in the dictionary.
        this.dictionary["One"] = 10;
        this.dictionary["Another"] = "ABC";

        // The validation functions:
        this.validators["One"] = obj => ((int)obj) >= 0;
        this.validators["Another"] = obj => obj != null;
    }

    public Object this[string name]
    {
        get { return this.dictionary[name]; }
        set
        {
            // This assumes the dictionary contains a default for _all_ names.
            if (!this.dictionary.Contains(name))
                throw new ArgumentException("Name is invalid.");

            // Get a validator function. If there is one, it must return true.
            Func<Object, bool> validator;
            if (validators.TryGetValue(name, out validator) &&
                !validator(value))
                throw new ArgumentException("Value is invalid.");

            // Now set the value.
            this.dictionary[name] = value;
        }
    }
}

关于这段代码的一些注意事项:

  • 字典是一个通用对象:字符串和对象字典,其中String是 key 的类型,Object是值的类型。如果您只有一种值(例如整数),那么您应该更改 Object无处不在,例如,int .
  • 给定一个实例 MyClass myClass , 你可以做 myClass["One"] = 20设置 One 的值.
  • 如果您(无意中)尝试使用不存在的名称 (var value = myClass["DoesNotExist"]) 获取值,您将得到一个异常。您可以更改它以返回默认值或完全执行其他操作。
  • 使用enum , 创建枚举并指定其类型而不是 String在代码中。

关于C# 变量 getter / setter ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15015246/

相关文章:

c# - Gridview 标题链接按钮未更新

c# - 我应该为 Windows 8 Metro 应用程序中的本地数据库使用什么

c# - Entity Framework 6 : Dynamically build search clause against DB

c# - 使用工厂模式创建连接字符串

c# - 将 Sharepoint 2007 解决方案转换为 2010

c# - 我如何知道 Selenium 在父节点下的节点位置?

c# - 将每行中具有 int 值的文件转换为 IEnumerable<int>

c# - 如何将图像更新到不同的线程?

c#写入没有完整路径的文件

c# - 当方法为 TaskCompletionSource<bool> 变量返回 .Task 时,这意味着什么?