【问题标题】:Can we pass parameter to C# property?我们可以将参数传递给 C# 属性吗?
【发布时间】:2015-10-26 00:29:52
【问题描述】:

我们有一个具有 getter 的类的属性 - 返回值

例如:

Public Employee Department
{
get { return GetTheValue("Mid Level") ;} 
}

GetTheValue 是我们的框架方法,它接受参数值并返回字符串。参数值现在是硬编码的,我们想让它动态化……我们想将该参数值直接传递给属性。我们可以将参数传递给属性吗?不想将其作为方法,只希望将参数传递给属性..我该如何实现呢?

【问题讨论】:

  • 你可以像索引器那样做,但这会让任何试图维护你的代码的人感到困惑。让它成为一种方法。
  • 你为什么想让它成为一种方法?

标签: c# dynamic properties parameters


【解决方案1】:

可以使用类似于属性的indexer...

public Employee this[string department]
{
    get
    {
        return GetTheValue(department);
    }
}
...

var instance = new Whatever();
var employee = instance["Mid Level"]

但那是滥用。我只会使用一种方法...

public Employee GetDepartment(string department)
{
    return GetTheValue(department);
}

【讨论】:

  • 我有多个属性,如果我将它们更改为索引器,我如何从实例对象中调用它们.. instance[" ???"]
  • 每种类型只能有一个索引器。
  • 你不能,这就是为什么你应该为此使用索引器!
  • 其实我说的并不是完全正确的。我刚刚检查了the spec',你可以有多个索引器,只要它们的签名不同,但这是非常有限的,只是一个全面的想法。
  • 我认为展示期望的行为是可能的但不应该使用是件好事。开发人员通常会在脑海中产生一个想法,并决心以这种方式实现它。证明这是可能的,但不应该这样做可能会让读者更快地脱离这种思路。
【解决方案2】:

您所做的事情完美地描述了方法的目的。您希望这样做:

public Employee GetDepartment(string value)
{
    return GetTheValue(value);
}

因为您要向属性添加参数,而属性只是get_xxxset_xxx 这两种方法的语法糖,可以对调用约定进行优化。因此,属性的设计并不适合您正在做的事情。

【讨论】:

  • (我平安来了)。我不会像您那样对您的答案投反对票,但是公平地说这确实回答了这个问题。我非常感谢您在评论中提出的观点,但可能这个问题是假设性的并且是出于教育目的。在(诚然)可能不是的情况下,我们能做的最好的事情就是警告这种方法。根据他/她在我的回答中留下的评论,提问者可能会发现索引器对于他/她的目的过于有限无论如何
猜你喜欢
  • 2023-04-01
  • 1970-01-01
  • 2015-09-23
  • 1970-01-01
  • 2013-06-11
  • 2010-12-13
  • 1970-01-01
  • 1970-01-01
  • 2013-01-05
相关资源
最近更新 更多